45

I have a json block like this:

{
    "ADDRESS_MAP":{

        "ADDRESS_LOCATION":{
            "type":"separator",
            "name":"Address",
            "value":"",
            "FieldID":40
        },
        "LOCATION":{
            "type":"locations",
            "name":"Location",
            "keyword":{
                "1":"LOCATION1"
            },
            "value":{
                "1":"United States"
            },
            "FieldID":41
        },
        "FLOOR_NUMBER":{
            "type":"number",
            "name":"Floor Number",
            "value":"0",
            "FieldID":55
        },
        "self":{
            "id":"2",
            "name":"Address Map"
        }
    }
}

How can I get all the key items that this token includes. For example from the above code I want to have "ADRESS_LOCATION" , "LOCATION", "FLOOR_NUMBER" and "self".

4

3 回答 3

66

您可以将您的JToken转换为 a JObject,然后使用该Properties()方法获取对象属性的列表。从那里,您可以很容易地获得名称。

像这样的东西:

string json =
@"{
    ""ADDRESS_MAP"":{

        ""ADDRESS_LOCATION"":{
            ""type"":""separator"",
            ""name"":""Address"",
            ""value"":"""",
            ""FieldID"":40
        },
        ""LOCATION"":{
            ""type"":""locations"",
            ""name"":""Location"",
            ""keyword"":{
                ""1"":""LOCATION1""
            },
            ""value"":{
                ""1"":""United States""
            },
            ""FieldID"":41
        },
        ""FLOOR_NUMBER"":{
            ""type"":""number"",
            ""name"":""Floor Number"",
            ""value"":""0"",
            ""FieldID"":55
        },
        ""self"":{
            ""id"":""2"",
            ""name"":""Address Map""
        }
    }
}";

JToken outer = JToken.Parse(json);
JObject inner = outer["ADDRESS_MAP"].Value<JObject>();

List<string> keys = inner.Properties().Select(p => p.Name).ToList();

foreach (string k in keys)
{
    Console.WriteLine(k);
}

输出:

ADDRESS_LOCATION
LOCATION
FLOOR_NUMBER
self
于 2013-05-28T17:06:22.670 回答
43

除了接受的答案之外,我想给出一个答案,说明如何直接迭代 Newtonsoft 集合。它使用更少的代码,我猜它更有效,因为它不涉及转换集合。

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
//Parse the data
JObject my_obj = JsonConvert.DeserializeObject<JObject>(your_json);

foreach (KeyValuePair<string, JToken> sub_obj in (JObject)my_obj["ADDRESS_MAP"])
{
    Console.WriteLine(sub_obj.Key);
}

我自己开始这样做是因为 JsonConvert 自动将嵌套对象反序列化为 JToken(我认为是 JObject、JValue 或 JArray)。

我认为解析的工作原理如下:

  • 每个对象都被抽象为一个 JToken

  • 投射到您期望字典的 JObject

  • 如果 JToken 代表一个终端节点并且是一个值,则强制转换为 JValue

  • 如果它是一个数组,则转换为 JArray

  • JValue.Value 为您提供所需的 .NET 类型

于 2016-07-07T19:39:39.817 回答
2

如果您知道您收到的 json 的结构,那么我建议您使用一个类结构来反映您在 json 中收到的内容。

然后你可以这样称呼它......

AddressMap addressMap = JsonConvert.DeserializeObject<AddressMap>(json);

(其中 json 是包含相关 json 的字符串)

如果您不知道收到的 json 格式,那么它会变得有点复杂,您可能需要手动解析它。

查看http://www.hanselman.com/blog/NuGetPackageOfTheWeek4DeserializingJSONWithJsonNET.aspx了解更多信息

于 2013-05-28T15:35:20.733 回答