2016-07-21 6 views
0

ich Json Objekt wie folgt bekam -Wie in EXPANDO Objekt suchen

enter image description here

und einige Zeiten wie diesen -

enter image description here

So ist die Reihenfolge des Objekts nicht festgelegt ist. Im obigen Beispiel muss das Feld "CreatedOn" im DB gespeichert werden.

Ich verwende folgenden Code es in ExpandoObject zu konvertieren -

JObject jsonObject = JObject.Parse(json); 

    // eval into an expando 
    dynamic dynObject = ConvertJTokenToObject(jsonObject); 

und hier ConvertJTokenToObject -

public object ConvertJTokenToObject(JToken token) 
     { 
      if (token is JValue) 
      { 
       return ((JValue)token).Value; 
      } 

      if (token is JObject) 
      { 
       ExpandoObject expando = new ExpandoObject(); 
       (from childToken in ((JToken)token) where childToken is JProperty select childToken as JProperty).ToList().ForEach(property => 
       { 
        ((IDictionary<string, object>)expando).Add(property.Name, ConvertJTokenToObject(property.Value)); 
       }); 

       return expando; 
      } 

      if (token is JArray) 
      { 
       object[] array = new object[((JArray)token).Count]; 
       int index = 0; 
       foreach (JToken arrayItem in ((JArray)token)) 
       { 
        array[index] = ConvertJTokenToObject(arrayItem); 
        index++; 
       } 
       return array; 
      } 
      throw new ArgumentException(string.Format("Unknown token type '{0}'", token.GetType()), "token"); 
     } 

Nun ist das Problem, dass ich weiß nicht, welche "Dimension" Element wird " CreatedOn "Feld.

Das funktioniert gut mit dem ersten Fall -

dynObject.context.custom.dimensions[0].CreatedOn 

aber bricht in einem anderen Fall, wie es sein sollte -

dynObject.context.custom.dimensions[1].CreatedOn 

Wie von Feldern Namen wie "CreatedOn" suchen ExpandoObject " Status "usw.

+0

1) Newtonsoft hat [eingebaute Fähigkeit deserialisieren zu 'ExpandoObject'] suchen können (http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_Converters_ExpandoObjectConverter.htm). Tun Sie einfach 'dynamic dynObject = jsonObject.ToObject ();' 2) Aber warum überhaupt? Bleiben Sie einfach bei 'JToken' und verwenden Sie [' SelectToken'] (http://www.newtonsoft.com/json/help/html/QueryJsonSelectToken.htm) oder ['dynamic'] (http://www.newtonsoft.com) /json/help/html/QueryJsonDynamic.htm). – dbc

+0

@dbc, yeah Ich habe SelectToken benutzt und es hat funktioniert! –

Antwort

0

Da ExpandoObject IDictionary implementiert, können Sie nicht einfach Folgendes tun:

if (dynObject.context.custom.dimensions[1] as IDictionary<string,object>).ContainsKey("CreatedOn") { 
//Your logic here... 
} 
+0

so was im Falle davon ist Innenmaße [0] und manchmal Maße [2] ..... –

0

Sie müssen die Dimensionen abflachen, ich denke, Ihr Problem ist nicht eine Eigenschaft in expando über Namen zu finden, können Sie tun, indem Sie die expando Struktur durch Punktnotation ... Ich kann Somat posten, wenn Sie müssen weiß das. Aber Ihr Hauptproblem ergibt sich aus Dimensionen einer dynamic[] sein, so dass Sie Dimensionen wie var dimensions = dynObject.Context.Custom.dimensions bekommen müssten und sie dann flach wie var flattened = FlattenDimensions(dimensions) dies wird Ihnen ein Wörterbuch wie

enter image description here

Flatten Methode

private static Dictionary<string, object> FlattenDimensions(dynamic[] dimensions) 
    { 
     var flattened = new Dictionary<string, object>(); 
     foreach (var dimension in dimensions) 
     { 
      var dict = (IDictionary<string, object>)dimension; 
      foreach (var item in dict) 
      { 
       flattened.Add(item.Key, item.Value); 
      } 
     } 
     return flattened; 
    } 

können Sie die oben genannte Methode an Ihre Bedürfnisse besser anpassen, aber es ist eine Idee Und wie Sie jetzt eine abgeflachte Wörterbuch haben Sie für CreatedOn oder jede andere Eigenschaft

--hope das macht Sinn

Verwandte Themen