2013-03-05 6 views
6

Ich habe folgende JSON:Deserialize dynamisch genannt JSON-Objekte in C# (mit JSON.Net oder anderweitig)

{ 
"aaaa": { 
    "name": "General Name", 
    "product": "book", 
    "host": "book.example.com", 
    "chapters": { 
     "bbbb": { 
      "name": "Chapter 1", 
      "page": "1", 
      "end_page": "25" 
     } 
    }, 
    "categories" : { 
     "analysis":{ 
      "Abbbb" : { 
        "name": "B Chapter", 
        "id" : "9001" 
      }, 
      "Acccc" : { 
        "name": "C Chapter", 
        "id" : "9001" 
      }, 
      "Adddd" : { 
        "name": "D Chapter", 
        "id" : "9001" 
      }, 
      "Aeeee" : { 
        "name": "E Chapter", 
        "id" : "9001" 
      }, 
      "Affff" : { 
        "name": "F Chapter", 
        "id" : "9001" 
      }, 
      "Agggg" : { 
        "name": "G Chapter", 
        "id" : "9001" 
      } 
     }, 
     "sources":{ 
      "acks" : { 
        "name": "S. Spielberg", 
        "id" : "9001" 
      } 
     } 
    } 
} 
"yyyy": { 
    "name": "Y General Name", 
    "product": "Y book", 
    "host": "ybook.example.com", 
    ... 
} 
"zzzz": { 
    "name": "Z General Name", 
    "product": "Z book", 
    "host": "zbook.example.com", 
    ... 
} 

Die Werte für aaaa, yyyy und zzzz eine beliebige Zeichenfolge und es kann eine beliebige Zahl sein kann von ihnen.

Ich muss alle [aaaa|yyyy|zzz].categories.analysis Werte extrahieren. Das heißt, ich brauche mit einem Dictionary<string, string> der Objekt Namen (z.B. Abbbb, Acccc, etc.) und der ID, ignorierte die name Zeichenfolge enden.

Eg, [Abbbb, 9001] [Acccc, 9001] [Adddd, 9001] ... [Zaaaa, 9001]

Ich habe viel zu lange auf diese gewesen und fühlen als ob mir etwas offensichtlich fehlt. Ich habe JSON.net und native Serialisierung ausprobiert. Dies ist eine triviale Aufgabe in jeder anderen Sprache, die ich benutzt habe.

Ich habe nahe kommen mit etwas wie folgt aus:

var ajsonObject = JsonConvert.DeserializeObject<dynamic>(jsonString); 
var oasearch_categories = ajsonObject.aaaa.categories.analysis; 

Aber auch hier aaaa kann eine beliebige Zeichenfolge sein, so dass ich bin mir nicht sicher, wie das dynamisch zu verweisen.

Antwort

2

dauerte eine Weile, aber ich habe es herausgefunden. Meine Forderung leicht von der ursprünglichen Frage geändert ... Mein Endergebnisses erforderlich, um ein Wörterbuch von Listen, so würde ich mit einem Wörterbuch am Ende wie:

DICT[ {"9001", ["Abbbb", "Acccc", "Adddd", ...]}, {"9002", ["Zbbbb, Zdddd", ...]}, etc. ] 
     | key | |   value    | | key | |  value  | 

Dies ist das Ergebnis:

Dictionary<string, List<string>> idsAndTheirNames = new Dictionary<string, List<string>>(); 

try 
{ 
    var ajsonObject = JsonConvert.DeserializeObject<dynamic>(JSONstring); 

    foreach (var child in ajsonObject.Children()) 
    { 
     foreach (var product in child.Children()) 
     { 
      var categories = product.categories.analysis; 

      foreach (var category in categories.Children()) 
      { 
       foreach (var subcat in category) 
       { 
        List<string> name = idsAndTheirNames[(string)subcat.id]; //e.g., "9001" 

        if (name == null) name = new List<string>(); 

        name.Add(category.Name); //e.g., "Abbbb" 
        idsAndTheirNames[(string)subcat.id] = name; //"9001" -> ["Abbbb", "Acccc", etc.] 

        System.Diagnostics.Debug.WriteLine((string)category.Name); //"Abbbb" 
        System.Diagnostics.Debug.WriteLine((string)subcat.name); //"Chapter B" 
        System.Diagnostics.Debug.WriteLine((string)subcat.id);  //"9001" 
       } 
      } 
     } 
    } 
} 
catch (Exception ex) 
{ 
    System.Diagnostics.Debug.WriteLine("JSON ERROR: " + ex.Message); 
} 
Verwandte Themen