2012-05-17 34 views
7

Tôi đang cố gắng viết hàm trong C# sẽ chuyển đổi JSON thành cặp khóa/giá trị. Nó sẽ hỗ trợ mảng. Vì vậy, ví dụ như JSON sau:Cách chuyển đổi json thành cấu trúc phẳng trong C#

{ 
    title: title_value, 
    components: [ 
     { 
      component_id: id1, 
      menu: [ 
        {title: menu_title1}, 
        {title: menu_title_x}, 
        {id: menu_id1}  
      ] 
     }, 
     { 
      component_id: id2, 
      menu: [ 
        {title: menu_title2}, 
        {id: menu_id2}  
      ] 
     } 
    ] 
} 

nên được chuyển đổi sang:

  • title = title_value
  • components.0.component_id = id1
  • components.0.menu.0.title = menu_title1
  • components.0.menu.1.title = menu_title_x
  • components.0.menu.2.id = menu_id1
  • components.1.component_id = id2
  • components.1.menu.0.title = menu_title2
  • components.1.menu.1.id = menu_id2

Có bất kỳ cách nào đơn giản để làm nhiệm vụ này? Logic trở nên phức tạp khi tôi bắt đầu xem xét các mảng và mảng lồng nhau.

Trả lời

1

Giải pháp cho điều này là như sau. JavaScriptSerializer tạo đối tượng ('o') từ chuỗi json ('json'), so với phương thức BuildVariablesList đi qua đối tượng và điền từ điển ('additionalParameters') có chứa kết quả.

var jss = new JavaScriptSerializer(); 
    var o = return new DynamicJsonObject(jss.Deserialize<Dictionary<string, object>>(json)); 

    var additionalParameters = new Dictionary<string, string>(); 
    BuildVariablesList(o.GetInternalDictionary(), "", additionalParameters); 

    private static string AppendToPathString (string path, object part) 
    { 
     return path.Trim().Length == 0 ? part.ToString() : path + '.' + part; 
    } 

    public static void BuildVariablesList(object obj, string path, Dictionary<string, string> result) 
    { 
     if (obj is ArrayList) 
     { 
      var arrayObj = obj as ArrayList; 
      for (var i = 0; i<arrayObj.Count; i++) 
      { 
       BuildVariablesList(arrayObj[i], AppendToPathString(path,i), result); 
      } 
     }else if (obj is Dictionary<string, object>) 
     { 
      var dictObject = obj as Dictionary<string, object>; 
      foreach (var entry in dictObject) 
      { 
       if (entry.Value is String && (path.Trim().Length > 0 || !ReservedFieldNames.Contains(entry.Key.ToLower()))) 
       { 
        result.Add(AppendToPathString(path,entry.Key), entry.Value as String); 
       } 
       else if (entry.Value is Dictionary<string, object>) 
       { 
        BuildVariablesList(entry.Value as Dictionary<string, object>, AppendToPathString(path, entry.Key), result); 
       } 
       else if (entry.Value is ArrayList) 
       { 
        BuildVariablesList(entry.Value as ArrayList, AppendToPathString(path, entry.Key), result); 
       } 
      } 
     }    
    } 
Các vấn đề liên quan