访问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获取更多信息