Доступ ко всем элементам в 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".
Спасибо
Ответы
Ответ 1
Вы можете применить 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
Ответ 2
В дополнение к принятому ответу я хотел бы дать ответ, который показывает, как итерации непосредственно над коллекциями 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, где вы ожидаете словаря
-
Передача в JValue, если JToken представляет терминал node и представляет собой значение
-
Передать в JArray, если его массив
-
JValue.Value дает вам тип .NET, который вам нужен
Ответ 3
Если вы знаете структуру json, которую вы получаете, я бы предложил создать структуру классов, которая отражает то, что вы получаете в json.
Затем вы можете вызвать его что-то вроде этого...
AddressMap addressMap = JsonConvert.DeserializeObject<AddressMap>(json);
(Где json - строка, содержащая json)
Если вы не знаете формат json, который у вас есть, он становится немного сложнее, и вам, вероятно, придется вручную его разобрать.
просмотрите http://www.hanselman.com/blog/NuGetPackageOfTheWeek4DeserializingJSONWithJsonNET.aspx для получения дополнительной информации