我有一个像这样的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”。
由于
答案 0 :(得分:52)
您可以将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<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
答案 1 :(得分:20)
除了接受的答案,我想给出一个答案,说明如何直接在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
转换到期望词典
如果JToken代表终端节点并且是值
如果是数组
JValue.Value为您提供所需的.NET类型
答案 2 :(得分:0)
如果你知道你收到的json的结构,那么我建议你有一个类结构来反映你在json中收到的内容。
然后你可以称之为......
AddressMap addressMap = JsonConvert.DeserializeObject<AddressMap>(json);
(其中json是包含所讨论的json的字符串)
如果你不知道你收到的json的格式,那么它会变得有点复杂,你可能需要手动解析它。
查看http://www.hanselman.com/blog/NuGetPackageOfTheWeek4DeserializingJSONWithJsonNET.aspx了解详情