Wie man JSON-Daten deserialisiert?

Ich bin neu in der Arbeit mit JSON-Daten.

Ich lese Daten von einem Webservice. Die zurückgesendeten Abfragedaten lauten wie folgt:

[["B02001_001E","NAME","state"], ["4712651","Alabama","01"], ["691189","Alaska","02"], ["6246816","Arizona","04"], ["18511620","Florida","12"], ["9468815","Georgia","13"], ["1333591","Hawaii","15"], ["1526797","Idaho","16"], ["3762322","Puerto Rico","72"]] 

Gibt es eine Möglichkeit, diese Daten so zu deserialisieren, dass das Basisobjekt generiert wird, ohne dass ich zuerst definiere, wie das Objekt ist? Im obigen Beispiel ist das Objekt durch die erste Zeile definiert:

  ["B02001_001E","NAME","state"], 

Im Allgemeinen gibt der Webdienst die Abfragedaten zurück, die als zweidimensionales JSON-Array formatiert sind, wobei die erste Zeile Spaltennamen und nachfolgende Zeilen Datenwerte bereitstellen.

   

    Sie können dies sehr einfach deserialisieren. Die Datenstruktur in C # ist nur List so dass Sie einfach tun können;

      List data = JsonConvert.DeserializeObject>(jsonString); 

    Der obige Code geht davon aus, dass Sie json.NET verwenden.

    EDIT: Beachten Sie, dass der JSON technisch ein Array von String-Arrays ist. Ich bevorzuge die Verwendung von List für meine eigene Deklaration, weil es intuitiver ist. Es wird keine Probleme für json.NET geben, wenn Sie wollen, dass es ein Array von String-Arrays ist, dann müssen Sie den Typ ändern in (ich denke) string[][] aber es gibt einige lustige kleine Gotcha’s mit gezackten und 2D-Arrays in C #, die ich nicht wirklich kenne, darum kümmere ich mich einfach nicht darum.

    Wenn Sie .Net 4.5 verwenden, können Sie auch den Standard .Net Json Serializer verwenden:

     using System.Runtime.Serialization.Json; ... Stream jsonSource = ...; // serializer will read data stream var s = new DataContractJsonSerializer(typeof(string[][])); var j = (string[][])s.ReadObject(jsonSource); 

    In .NET 4.5 und älter können Sie die JavaScriptSerializer-class verwenden:

     using System.Web.Script.Serialization; ... JavaScriptSerializer serializer = new JavaScriptSerializer(); string[][] list = serializer.Deserialize(json); 

    Schritt 1: Gehen Sie zu json.org, um die JSON-Bibliothek für die Technologie zu finden, mit der Sie diesen Webdienst aufrufen. Downloaden und verlinken Sie diese Bibliothek.

    Schritt 2: Nehmen wir an, Sie verwenden Java. Sie würden JSONArray wie folgt verwenden:

     JSONArray myArray=new JSONArray(queryResponse); for (int i=0;i 

    Sie können Ihren eigenen JSON-Parser schreiben und ihn basierend auf Ihren Anforderungen generischer gestalten. Hier ist einer, der meinem Zweck gut gedient hat, Hoffnung wird dir auch helfen.

     class JsonParsor { public static DataTable JsonParse(String rawJson) { DataTable dataTable = new DataTable(); Dictionary outdict = new Dictionary(); StringBuilder keybufferbuilder = new StringBuilder(); StringBuilder valuebufferbuilder = new StringBuilder(); StringReader bufferreader = new StringReader(rawJson); int s = 0; bool reading = false; bool inside_string = false; bool reading_value = false; bool reading_number = false; while (s >= 0) { s = bufferreader.Read(); //open JSON if (!reading) { if ((char)s == '{' && !inside_string && !reading) { reading = true; continue; } if ((char)s == '}' && !inside_string && !reading) break; if ((char)s == ']' && !inside_string && !reading) continue; if ((char)s == ',') continue; } else { if (reading_value) { if (!inside_string && (char)s >= '0' && (char)s < = '9') { reading_number = true; valuebufferbuilder.Append((char)s); continue; } } //if we find a quote and we are not yet inside a string, advance and get inside if (!inside_string) { if ((char)s == '\"' && !inside_string) inside_string = true; if ((char)s == '[' && !inside_string) { keybufferbuilder.Length = 0; valuebufferbuilder.Length = 0; reading = false; inside_string = false; reading_value = false; } if ((char)s == ',' && !inside_string && reading_number) { if (!dataTable.Columns.Contains(keybufferbuilder.ToString())) dataTable.Columns.Add(keybufferbuilder.ToString(), typeof(string)); if (!outdict.ContainsKey(keybufferbuilder.ToString())) outdict.Add(keybufferbuilder.ToString(), valuebufferbuilder.ToString()); keybufferbuilder.Length = 0; valuebufferbuilder.Length = 0; reading_value = false; reading_number = false; } continue; } //if we reach end of the string if (inside_string) { if ((char)s == '\"') { inside_string = false; s = bufferreader.Read(); if ((char)s == ':') { reading_value = true; continue; } if (reading_value && (char)s == ',') { //put the key-value pair into dictionary if(!dataTable.Columns.Contains(keybufferbuilder.ToString())) dataTable.Columns.Add(keybufferbuilder.ToString(),typeof(string)); if (!outdict.ContainsKey(keybufferbuilder.ToString())) outdict.Add(keybufferbuilder.ToString(), valuebufferbuilder.ToString()); keybufferbuilder.Length = 0; valuebufferbuilder.Length = 0; reading_value = false; } if (reading_value && (char)s == '}') { if (!dataTable.Columns.Contains(keybufferbuilder.ToString())) dataTable.Columns.Add(keybufferbuilder.ToString(), typeof(string)); if (!outdict.ContainsKey(keybufferbuilder.ToString())) outdict.Add(keybufferbuilder.ToString(), valuebufferbuilder.ToString()); ICollection key = outdict.Keys; DataRow newrow = dataTable.NewRow(); foreach (string k_loopVariable in key) { CommonModule.LogTheMessage(outdict[k_loopVariable],"","",""); newrow[k_loopVariable] = outdict[k_loopVariable]; } dataTable.Rows.Add(newrow); CommonModule.LogTheMessage(dataTable.Rows.Count.ToString(), "", "row_count", ""); outdict.Clear(); keybufferbuilder.Length=0; valuebufferbuilder.Length=0; reading_value = false; reading = false; continue; } } else { if (reading_value) { valuebufferbuilder.Append((char)s); continue; } else { keybufferbuilder.Append((char)s); continue; } } } else { switch ((char)s) { case ':': reading_value = true; break; default: if (reading_value) { valuebufferbuilder.Append((char)s); } else { keybufferbuilder.Append((char)s); } break; } } } } return dataTable; } }