访问JTOKEN,json.net中的所有项目

我有一个像这样的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" } } } 

如何获取此令牌包含的所有关键项。 例如,从上面的代码我想要“ADRESS_LOCATION”,“LOCATION”,“FLOOR_NUMBER”和“self”。

谢谢

您可以将JToken转换为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(); List keys = inner.Properties().Select(p => p.Name).ToList(); foreach (string k in keys) { Console.WriteLine(k); } 

输出:

 ADDRESS_LOCATION LOCATION FLOOR_NUMBER self 

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

 using Newtonsoft.Json; using Newtonsoft.Json.Linq; //Parse the data JObject my_obj = JsonConvert.DeserializeObject(your_json); foreach (KeyValuePair 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类型

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

然后你可以称之为……

 AddressMap addressMap = JsonConvert.DeserializeObject(json); 

(其中json是包含所讨论的json的字符串)

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

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