web-dev-qa-db-fra.com

accéder à tous les éléments de 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 inclus dans ce jeton? Par exemple, dans le code ci-dessus, je souhaite avoir "ADRESS_LOCATION", "LOCATION", "FLOOR_NUMBER" et "self".

Merci

33

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
55
Brian Rogers

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

27
Ian

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

1
James Sinclair