accéder à tous les éléments du JTOKEN, json.net

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 que ce jeton inclut. Par exemple, à partir du code ci-dessus, je veux avoir "ADRESS_LOCATION", "LOCATION", "FLOOR_NUMBER" et "self".

Merci

25
demandé sur Brian Rogers 2013-05-28 18:47:28

3 réponses

, Vous pouvez lancer votre JToken pour un JObject, puis utiliser le Properties() méthode pour obtenir une liste des propriétés de l'objet. De là, vous pouvez obtenir les noms assez facilement.

Quelque Chose comme ceci:

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
42
répondu Brian Rogers 2013-05-28 17:14:47

En plus de la réponse acceptée, Je voudrais donner une réponse qui montre comment itérer directement sur les collections Newtonsoft. Il utilise moins de code et je suppose que c'est plus efficace car cela n'implique pas la conversion des 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 comme JToken (qui sont JObject, JValue ou JArray en dessous je pense).

Je pense que l'analyse fonctionne comme suit principes:

  • Chaque objet est Abstrait comme un JToken

  • Convertir vers JObject où vous attendez un dictionnaire

  • Convertir en JValue si le jtoken représente un nœud terminal et est une valeur

  • Convertir en JArray si c'est un tableau

  • JValue.Valeur vous donne le type. net dont vous avez besoin

16
répondu Ian 2017-03-31 17:53:50

Si vous connaissez la structure du json que vous recevez, je vous suggère d'avoir une structure de classe qui reflète ce que vous recevez dans json.

Ensuite, vous pouvez appeler quelque chose comme ceci...

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 avez reçu, cela devient un peu plus compliqué et vous devrez probablement l'analyser manuellement.

Vérifier http://www.hanselman.com/blog/NuGetPackageOfTheWeek4DeserializingJSONWithJsonNET.aspx pour plus d'informations

0
répondu James Sinclair 2013-05-28 15:57:04