2012-05-17 14 views
7

Ich versuche, Funktion in C# zu schreiben, die JSON zu einem Schlüssel/Wert-Paare konvertiert. Es sollte Arrays unterstützen. So zum Beispiel die folgende JSON:Wie zu konvertieren Json zu flache Struktur in C#

  • title = title_value
  • components.0.component_id = id1
  • components.0.menu.0.title:

    { 
        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}  
          ] 
         } 
        ] 
    } 
    

    sollte umgewandelt werden = 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

Ist es ein einfacher Weg, zu tun diese Aufgabe? Die Logik wird kompliziert, wenn ich Arrays und verschachtelte Arrays in Betracht ziehe.

Antwort

1

Die Lösung dafür ist wie folgt. JavaScriptSerializer erstellt Objekt ('o') aus JSON-Zeichenfolge ('JSON'), als die Methode BuildVariablesList das Objekt durchquert und das Wörterbuch ('additionalParameters') auffüllt, das die Ergebnisse enthält.

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); 
       } 
      } 
     }    
    }