2016-03-21 14 views
0

Ich habe den folgenden Code:Zugriff auf Daten in verschachtelten ExpandoObject

 string responJsonText = "{'A609C5DC-E86A-11E5-BD37-3EF25AFC4F71': {'username': 'testuser1','mydata1': 52,'mydata2': 1,'mydata3': '+1889','lastupdate': '2016-03-21 11:49:28'},'C5DD67C5-F34B-34DC-DB67-4F5376BD7813': {'username': 'testuser2','mydata1': 52.7,'mydata2': 1.5,'mydata3': '+2373','lastupdate': '2016-03-20 14:38:28'}}"; 
     //data usually retrieved from web service 
     dynamic response = new ExpandoObject(); 
     response = Newtonsoft.Json.JsonConvert.DeserializeObject<ExpandoObject>(responJsonText); 

     foreach (KeyValuePair<string, object> kvp in response) 
     { 
      Debug.WriteLine("{0} = {1}", kvp.Key, kvp.Value); 
      foreach (KeyValuePair<string, object> kvp2 in kvp.Value as ExpandoObject) 
       Debug.WriteLine("{0} = {1}", kvp2.Key, kvp2.Value); 
     } 

Wie Sie es iteriert durch jedes json Objekt sehen kann und dann durch die inneren Objekte.

Allerdings würde Ich mag etwas einfacher so wie folgt verwenden, sondern kann meinen Kopf nicht drum herum kommen:

//Just an example 
foreach (var item in response) 
{ 
    Debug.WriteLine(item.username); 
} 

Ist das möglich?

Antwort

0

Es gibt eine Menge Möglichkeiten, um die username in Ihrem responJsonText zu bekommen. Ein einfacher Ansatz ist Querying JSON with LINQ wie folgt vor:

string responJsonText = "{'A609C5DC-E86A-11E5-BD37-3EF25AFC4F71': {'username': 'testuser1','mydata1': 52,'mydata2': 1,'mydata3': '+1889','lastupdate': '2016-03-21 11:49:28'},'C5DD67C5-F34B-34DC-DB67-4F5376BD7813': {'username': 'testuser2','mydata1': 52.7,'mydata2': 1.5,'mydata3': '+2373','lastupdate': '2016-03-20 14:38:28'}}"; 

JObject o = JObject.Parse(responJsonText); 
var children = o.Children().Children()["username"].Values<string>(); 

foreach (var item in children) 
{ 
    Debug.WriteLine(item); 
} 

Oder mit SelectToken with JSONPath wie:

JObject o = JObject.Parse(responJsonText); 
IEnumerable<JToken> names = o.SelectTokens("$..username"); 

foreach (var item in names) 
{ 
    Debug.WriteLine(item); 
} 
Verwandte Themen