2013-03-05 39 views
6

Tôi có JSON sau:đối tượng JSON Deserialize động có tên trong C# (sử dụng JSON.Net hay cách khác)

{ 
"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", 
    ... 
} 

Các giá trị cho aaaa, yyyyzzzz thể được bất kỳ chuỗi và có thể được bất kỳ số của họ.

Tôi cần trích xuất tất cả các giá trị [aaaa|yyyy|zzz].categories.analysis. Tức là, tôi cần phải kết thúc bằng một tên là Dictionary<string, string> của đối tượng tên (ví dụ: Abbbb, Acccc, v.v.) và ID, bỏ qua chuỗi name.

Ví dụ, [Abbbb, 9001] [Acccc, 9001] [Adddd, 9001] ... [Zaaaa, 9001]

Tôi đã ở này cho cách quá dài và cảm nhận như tôi thiếu một cái gì đó hiển nhiên. Tôi đã thử JSON.net và serialization bản địa. Đây là một nhiệm vụ tầm thường trong mọi ngôn ngữ khác mà tôi đã sử dụng.

tôi đã đến gần với một cái gì đó như thế này:

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

Nhưng một lần nữa, aaaa thể được bất kỳ chuỗi, vì vậy tôi không chắc chắn làm thế nào để tham khảo mà tự động.

Trả lời

2

Mất một lúc, nhưng tôi đã tìm ra. Yêu cầu của tôi đã thay đổi chút ít so với câu hỏi ban đầu ... kết quả cuối cùng của tôi cần một từ điển của danh sách, vì vậy tôi muốn kết thúc với một cuốn từ điển như:

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

Đây là kết quả:

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); 
} 
Các vấn đề liên quan