使用Json.NET读取Foursquare Json响应

本文关键字:Json 响应 Foursquare NET 使用 读取 | 更新日期: 2023-09-27 18:26:27

我正在尝试访问Foursquare响应中第一级的所有类别:-

{
    "meta": {
        "code": 200
    },
    "response": {
        "categories": [{
            "id": "4d4b7104d754a06370d81259",
            "name": "Arts & Entertainment",
            "pluralName": "Arts & Entertainment",
            "shortName": "Arts & Entertainment",
            "icon": {
                "prefix": "https:'/'/foursquare.com'/img'/categories'/arts_entertainment'/default_",
                "sizes": [32, 44, 64, 88, 256],
                "name": ".png"
            },
            "categories": [{
                "id": "4bf58dd8d48988d1e1931735"

使用JSON.NET:-

JObject o = JObject.Parse(FoursquareObject.GetCategories());
IList<string> categories = o.SelectToken("categories[0]").Select(s => (string)s).ToList();

其中FoursquareObject.GetCategories()以字符串形式返回响应。我还试过:-

JArray categories = (JArray)o["categories"];
var categories = (string) o["response[0].categories"];

和的许多变体,只是为了查看变量中的响应,并且总是得到"Object reference"或"cannot be{null}"错误。我知道我很接近,但就我的一生而言,我不知道如何获得回应的"类别"部分。。。

有人能给我指正确的方向吗?

感谢您的帮助。)

更新

感谢L.B和Meklarian的回答,我添加了这个代码(和的变体):-

dynamic four = JsonConvert.DeserializeObject(FoursquareObject.GetCategories());
        foreach (var cat in four)
        {
            context.Response.Write(cat.response.categories.id);
        }

但无论我在Write()中尝试什么,我总是得到:-

"Newtonsoft.Json.Linq.JProperty"不包含的定义"响应"

我尝试了很多组合,但没有成功。我检查了JSON文件的输出,得到了作为字符串的纯JSON响应。只是需要注意的是,类别可以存在于类别中,因此JSON看起来很糟糕。我向你保证不是。我完全被卡住了!

使用Json.NET读取Foursquare Json响应

有多种解析方法;但是在您最初呈现的样式中,您应该尝试使用[]索引器来访问它。

请注意,您的数据有一个具有两个属性的根对象,即metaresponse。假设response不能为null,您可以直接从它访问categories,如下所示:

var root = JObject.Parse(/* your json string here */);
var categories = root["response"]["categories"];
var firstCategory = categories[0];

请注意,您可以使用与属性名称匹配的字符串来下降到嵌套级别,使用整数来索引范围中的数组。

下面是一个示例程序的其余部分,它可以解析您提供的json片段。

using System.Windows.Forms;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Serialization;
namespace _4sqCatResponse
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            OpenFileDialog dlg = new OpenFileDialog();
            if(dlg.ShowDialog() != DialogResult.OK){return;}
            string json = System.IO.File.ReadAllText(dlg.FileName);
            var root = JObject.Parse(json);
            var categories = root["response"]["categories"];
            var firstCategory = categories[0];
            Console.WriteLine("id: {0}", firstCategory["id"]);
            Console.WriteLine("name: {0}", firstCategory["name"]);
            Console.WriteLine("pluralName: {0}", firstCategory["pluralName"]);
            Console.WriteLine("shortName: {0}", firstCategory["shortName"]);
            var icon = firstCategory["icon"];
            Console.WriteLine("icon.prefix: {0}", icon["prefix"]);
            Console.WriteLine("icon.sizes[0]: {0}", icon["sizes"][0]);
            Console.WriteLine("icon.name: {0}", icon["name"]);
            Console.ReadKey();
        }
    }
}

此外,我对您的json示例有点困惑;我认为您可能已经覆盖了样本的一部分,或者在类别中嵌套了类别时剪切了一些内容。如果你的类别元素中确实有一个二级类别,这就是你想要的,你可以用这个来访问它:

var categories2 = root["response"]["categories"][0]["categories"][0];
Console.WriteLine("inner categories id: {0}", categories2["id"]);

这是我用来测试的json源代码,它是从您的源代码复制的,但在需要进行解析的地方带有关闭的}]标记。

{
    "meta": {
        "code": 200
    },
    "response": {
        "categories": [{
            "id": "4d4b7104d754a06370d81259",
            "name": "Arts & Entertainment",
            "pluralName": "Arts & Entertainment",
            "shortName": "Arts & Entertainment",
            "icon": {
                "prefix": "https:'/'/foursquare.com'/img'/categories'/arts_entertainment'/default_",
                "sizes": [32, 44, 64, 88, 256],
                "name": ".png"
            },
            "categories": [{
                "id": "4bf58dd8d48988d1e1931735"
                }]
            }]
    }
}

我认为这应该能在中工作

dynamic four2 = JsonConvert.DeserializeObject(FoursquareObject.GetCategories());
foreach(var cat in four2.response.categories)
{
    Console.WriteLine(cat.id + " " + cat.name + " " + cat.icon.prefix);
}

使用http://json2csharp.com/要生成C#类,请使用RootObject,然后访问各个场地