【问题标题】:How can I extract these key/value pairs from this JSON node?如何从这个 JSON 节点中提取这些键/值对?
【发布时间】:2017-10-19 23:28:46
【问题描述】:

我已经成功地使用 JToken 和 JArray 来获取特定的数据,但是我遇到了一个特定的问题。问题在于从我的节点“work_unit”中的键/值对中提取值。您可以在我的 JObject 中看到这里的节点:

JObject testString = JObject.Parse("{"
                + "'Roofing': {"
                + "'Buildings': ["
                  + "{"
                    + "'BuildingId': 4,"
                    + "'BuildingName': 'what',"
                    + "'work_unit': '{\"RoofingBuildings\":\"1\",\"WindowsBuildings\":\"\",\"GutterBuildings\":\"\",\"InsulationMasterPrice\":\"\",\"SidingBuildings\":\"\"}'"
                 + "},"
                  + "{"
                    + "'BuildingId': 3,"
                    + "'BuildingName': 'Home'"
                 + "}"
                + "],"

                + "'Windows': ["
                  + "{"
                    + "'PerimeterDrawings': 56,"
                 + "},"
                  + "{"
                    + "'PerimeterDrawings': 55,"
                 + "}"
                + "]"

            + "},"

            + "'Window':"
                  + "{"
                    + "'poof': 3,"
                    + "'stall': 7"
                 + "},"

            + "'Products': ["
                  + "'Roofing',"
                  + "'Pooping',"
                + "],"

            + "'Garage': ["
                  + "{"
                    + "'roof': 3,"
                    + "'wall': 7"
                 + "},"
                 + "{"
                    + "'roof': 3,"
                    + "'wall': 7"
                 + "}"
                + "]"
        + "}");

我可以像这样得到整个 'work_unit':

JToken jt= JO.SelectToken("Roofing.Buildings[0].work_unit");
^^ jt will contain:
{{"RoofingBuildings":"1","WindowsBuildings":"","GutterBuildings":"","InsulationMasterPrice":"","SidingBuildings":""}}

如何从 RoofingBuildings 获得“1”?我尝试了几种方法,这里有一些,但它们最终都为空。

string foo1 = (string)JTNewTest.SelectToken(".RoofingBuildings");
string foo2 = (string)JO.SelectToken("Roofing.Buildings[0].work_unit[0].RoofingBuildings");

提前致谢,由于某种原因,我无法在任何其他在线示例中找到我的确切情况:/

【问题讨论】:

  • 最简单的方法是创建结构相同的类,然后将 JSON 反序列化为您的类类型。然后你像往常一样使用 C# 属性和枚举、LINQ 等访问它。
  • 无关:你可以使用多行字符串来去掉每一行的追加,使代码更具可读性和效率。
  • 您对使用 JToken 和 JArray 有什么特别的兴趣吗?因为有更简单的方法可以解决您的反序列化问题...
  • 嗨@ps2goat,我确实计划稍后将其反序列化为一个类。但现在我需要把它提取出来。
  • @javier_el_bene 以及这些方法是什么?我只是在使用它们,因为它看起来简单直接。

标签: c# json json.net


【解决方案1】:

你可以像这样得到它,我假设 work_unit 应该被拆分成它自己的属性而不是一个字符串。希望我的假设是正确的。为了便于阅读,还制作了多行字符串。

    JObject testString = JObject.Parse(@"
    {
        'Roofing': {
            'Buildings': 
            [
                {
                    'BuildingId': 4,
                    'BuildingName': 'what',
                    'work_unit': 
                    {
                        'RoofingBuildings':'1',
                        'WindowsBuildings':'',
                        'GutterBuildings':'',
                        'InsulationMasterPrice':'',
                        'SidingBuildings':''
                    }
                },
                {
                    'BuildingId': 3,
                    'BuildingName': 'Home'
                }
            ],
            'Windows': 
            [
                {
                    'PerimeterDrawings': 56,
                },
                {
                    'PerimeterDrawings': 55,
                }
            ]
        },
        'Window':
        {
            'poof': 3,
            'stall': 7
        },
        'Products': 
        [
            'Roofing',
            'Pooping'
        ],
        'Garage': 
        [
            {
                'roof': 3,
                'wall': 7
            },
            {
            'roof': 3,
            'wall': 7
            }
        ]
    }");

    var roofingBuildings = testString["Roofing"]["Buildings"][0]["work_unit"]["RoofingBuildings"];

    Console.WriteLine("RoofingBuildings: {0}", roofingBuildings);

【讨论】:

  • 嘿奥斯汀,这正是我的想法。当我去掉 '{' '}' 符号前后的单引号使其不是字符串时,它就起作用了。我故意假设这是一个字符串,我可以访问它,但我猜不是。我会让第三方知道来改变这个。谢谢。
  • @JoshuaRG1993,我想您可以访问它,但您还必须将 work_unit 解析为 JObject,然后提取信息。但是,它似乎是 JSON 中 JSON 的字符串表示形式。呵呵
  • 是的,可能是第三方搞错了。是的,这也是我的想法,我可以将该字符串序列化为 JObject 并再次遍历它,但我也认为它很愚蠢。我给他们发了电子邮件,让他们知道更改将不胜感激。再次感谢您的回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多