【问题标题】:Json.Net Changing from JObject loops to JArrayJson.Net 从 JObject 循环更改为 JArray
【发布时间】:2015-01-21 19:05:32
【问题描述】:

我正在提取一个如下所示的 JSON 提要。

{
    "bank": [
        {
            "id": 35,
            "name": "bank 1",
            "endpoints": [
                {
                    "epId": 407,
                    "epName": "FRED001"
                },
                {
                    "epId": 516,
                    "epName": "FRED002"
                },
                {
                    "epId": 625,
                    "epName": "FRED003"
                }
            ]
        },
        {
            "id": 32,
            "name": "bank 2",
            "endpoints": [
                {
                    "epId": 426,
                    "epName": "HENRY001"
                },
                {
                    "epId": 553,
                    "epName": "HENRY002"
                }
            ]
        },
        {
            "id": 20,
            "name": "bank 3",
            "endpoints": [
                {
                    "epId": 1802,
                    "epName": "GEORGE001"
                },
                {
                    "epId": 920,
                    "epName": "GEORGE002"
                },
                {
                    "epId": 1052,
                    "epName": "GEORGE003"
                }
            ]
        }
    ]
}

最终目标是使用已知的 epName 'FRED001' 进行搜索,并检索对应的 epId '407,输出到 MessageBox。

我可以在 C# 中使用循环来做到这一点,例如:

JObject jResults = JObject.Parse(jsonfeed);
JToken jResults_bank = jResults["bank"];

foreach (JObject bank in Results_bank)
{
    JToken jResults_bank_endpoint = bank["endpoints"];
    foreach (JObject endpoint in jResults_bank_endpoint)
    {
        if (bank["epName"].ToString() == "FRED001")
                {
            MessageBow.Show(bank["epId"].ToString());
        }
    }
}

然而,这似乎不是最好的方法,我相信我应该在 C# 中通过构建一个数组来做到这一点。如何使用JArray 获得相同的结果?

【问题讨论】:

标签: c# json json.net


【解决方案1】:

无需显式循环更改您的解析方式 - 您只需将 LINQ 与 JSON 一起使用:

using System;
using System.IO;
using System.Linq;
using Newtonsoft.Json.Linq;

class Test
{
    static void Main(string[] args)
    {
        string text = File.ReadAllText("Test.json");
        JObject json = JObject.Parse(text);
        var ids = from bank in json["bank"]
                  from endpoint in bank["endpoints"]
                  where (string) endpoint["epName"] == "FRED001"
                  select (string) endpoint["epId"];
        foreach (var id in ids)
        {
            Console.WriteLine(id);
        }
    }
}

【讨论】:

  • 哇,太好了。当您知道如何操作时,这很容易。谢谢。为了进一步扩展,假设我还想检索“name”:“bank 1”,我可以通过编辑“var ids”来做到这一点吗?
  • 想我可能已经明白了:var ids = from bank in json["bank"] from endpoint in bank["endpoints"] where (string) endpoint["epName"] == "FRED001" select new { epId = (string)endpoint["epId"], bankName = (string)bank["name"], }; foreach (var id in ids) { Console.WriteLine(id.epId); Console.WriteLine(id.bankName); }
  • @PhilH:抱歉,没有看到对您评论的修改 - 但是是的,基本上就是这样。
  • @JonSkeet 性能方面,lync 查询更好还是使用两个 for 循环?
【解决方案2】:

或者简单的方法就是像这样循环遍历它。

        JObject json = JObject.Parse(text);

        foreach (var id in json["bank"])
        {
           // your condition here
            if(id["epName"]=="FRED001")
            Console.WriteLine(id);
        }

【讨论】:

    【解决方案3】:
                    JObject JObj = (JObject)yourjsontext;
                    JArray JArr = (JArray)JObj["bank"];
                    for (int i = 0; i < JArr.Count; i++)
                    {
                        Console.WriteLine(JArr[i]["id"].ToString());
                        Console.WriteLine(JArr[i]["name"].ToString());
    
                        foreach (var endpoints in JArr[i]["endpoints"])
                        {
                            Console.WriteLine(endpoints["epId"].ToString());
                            Console.WriteLine(endpoints["epName"].ToString());
                        }
                    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-30
      相关资源
      最近更新 更多