J'ai un bloc JSON comme ceci:
{
"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"
}
}
}
Comment puis-je obtenir tous les éléments clés inclus dans ce jeton? Par exemple, dans le code ci-dessus, je souhaite avoir "ADRESS_LOCATION", "LOCATION", "FLOOR_NUMBER" et "self".
Merci
Vous pouvez convertir votre JToken
en un JObject
, puis utiliser la méthode Properties()
pour obtenir la liste des propriétés de l'objet. De là, vous pouvez obtenir les noms assez facilement.
Quelque chose comme ça:
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);
}
Sortie:
ADDRESS_LOCATION
LOCATION
FLOOR_NUMBER
self
En plus de la réponse acceptée, je voudrais donner une réponse qui montre comment parcourir directement les collections Newtonsoft. Il utilise moins de code et je devine qu'il est plus efficace car il ne s'agit pas de convertir les collections.
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);
}
J'ai commencé à le faire moi-même parce que JsonConvert désérialise automatiquement les objets imbriqués sous JToken (qui sont JObject, JValue ou JArray en dessous, je pense).
Je pense que l'analyse fonctionne selon les principes suivants:
Chaque objet est résumé comme un JToken
Cast à JObject où vous attendez un dictionnaire
Cast vers JValue si JToken représente un nœud terminal et est une valeur
Cast vers JArray si c'est un tableau
JValue.Value vous donne le type .NET dont vous avez besoin
Si vous connaissez la structure du JSON que vous recevez, je vous suggérerais alors d’avoir une structure de classe qui reflète ce que vous recevez dans JSON.
Ensuite, vous pouvez appeler son quelque chose comme ça ...
AddressMap addressMap = JsonConvert.DeserializeObject<AddressMap>(json);
(Où json est une chaîne contenant le json en question)
Si vous ne connaissez pas le format du json que vous recevez, cela devient un peu plus compliqué et vous auriez probablement besoin de l'analyser manuellement.
check out http://www.hanselman.com/blog/NuGetPackageOfTheWeek4DeserializingJSONWithJsonNET.aspx pour plus d'informations