web-dev-qa-db-fra.com

Désérialiser la chaîne Dynamic Json à l'aide de Newtonsoft JSON.NET

J'ai une chaîne JSON que je reçois de l'API Facebook, dans laquelle j'ai un nœud dont le nom change en fonction de son contenu, par exemple parfois 45 ou 58, etc. Il peut s'agir de n'importe quel nombre. Je veux sa valeur. Comment l'obtenir? Exemple:

{
"data": [
{
  "id": "1492292372_10201810786059989", 
  "created_time": "2014-04-05T09:00:54+0000"
}, 
{
  "id": "1492292372_10201804679827337", 
  "created_time": "2014-04-04T07:29:07+0000"
}, 
{
  "id": "1492292372_10201804649306574", 
  "created_time": "2014-04-04T07:10:33+0000"
}, 
{
  "id": "1492292372_10201801316823264", 
  "created_time": "2014-04-03T18:31:50+0000"
}, 
{
  "id": "1492292372_10201798962284402", 
  "created_time": "2014-04-03T06:24:47+0000"
}, 
{
  "message_tags": {
    "0": [
      {
        "id": "1492292372", 
        "name": "Yawar Sohail", 
        "type": "user", 
        "offset": 0, 
        "length": 12
      }
    ], 
    "15": [
      {
        "id": "1489845168", 
        "name": "Zeeshan Anjum", 
        "type": "user", 
        "offset": 15, 
        "length": 13
      }
    ]
  }, 
  "id": "1492292372_10201796274777216", 
  "created_time": "2014-04-02T17:57:05+0000"
}, 
{
  "id": "1492292372_10201794080482360", 
  "created_time": "2014-04-02T07:26:23+0000"
}, 

À l'intérieur de message_tags, il y a deux nœuds [0 et 15] qu'ils changent dynamiquement en fonction de leurs valeurs de décalage. Je veux des noms, du type et des identifiants dans ces nœuds.

16
Yawar

Vous pouvez désérialiser votre JSON en ExpandoObject :

var converter = new ExpandoObjectConverter();
dynamic obj = JsonConvert.DeserializeObject<ExpandoObject>(json, converter);

Ce qui ajoute dynamiquement des membres à votre objet au moment de l'exécution et vous permet de les parcourir comme décrit dans cette réponse :

foreach (var prop in obj.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public))
{
   Console.WriteLine("Name: {0}, Value: {1}",prop.Name, prop.GetValue(obj,null));
}

De cette façon, vous pouvez itérer sur obj.message_tags pour obtenir les messages individuels et obtenir tous leurs détails respectivement.

29
aevitas