【问题标题】:Read Foursquare Json Response with JSON.NET使用 JSON.NET 读取 Foursquare Json 响应
【发布时间】:2012-03-01 22:20: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"];

...以及许多变体,只是为了查看变量中的响应并始终得到“对象引用”或“不能为 {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 看起来似乎损坏了。我向你保证不是。我完全被卡住了!

【问题讨论】:

标签: c# linq json.net foursquare


【解决方案1】:

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

请注意,您的数据有一个具有两个属性的根对象,metaresponse。假设response 不能为空,您可以像这样直接从中访问categories

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

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

这是一个示例程序的其余部分,可以解析您提供的 json sn-p。

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"
                }]
            }]
    }
}

【讨论】:

  • 在尝试了这两个答案之后,这让我走上了正确的道路,我解决了这个问题。谢谢你们的回答。
【解决方案2】:

我认为这应该可行

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-11
      • 1970-01-01
      • 2012-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多