2017-02-11 4 views
1

ein Problem Nachdem ein JSON-String immer in eine C# Datentabelle zu konvertieren ...Ausgabe Umwandlung JSON-String zu Datatable C#

Hier ist ein Beispiel für die JSON-String, der Code aus einer API

mir zurückgegeben wird
{ 
    "Code": 0, 
    "Result": [ 
    { 
     "ID": 1, 
     "Reference": "101", 
     "Asset": 200, 
     "Event": 1, 
     "DateEventStart": "2/10/2017 9:08:33 PM", 
     "DateEvent": "2/11/2017 1:00:14 AM" 
    } 
] 
} 

das kommt also in der API und ich lese es, dann versuchen, eine Datentabelle wie diese

 var response = (HttpWebResponse)httpWebRequest.GetResponse(); 
     var encoding = Encoding.GetEncoding(response.CharacterSet); 
     var responseStream = response.GetResponseStream(); 
     var reader = new StreamReader(responseStream, encoding); 
     responsetext = reader.ReadToEnd(); 

     var table = JsonConvert.DeserializeObject<DataTable>(responsetext); 

erstellen jedoch dies der folgende Fehler gibt:

Unexpected JSON token when reading DataTable. Expected StartArray, got StartObject. Path '', line 1, position 1

Ich bin neu im Umgang mit JSON in C# so jede Hilfe geschätzt. Ich denke, dass meine Zeichenkette in irgendeiner Weise ungültig ist, um es zu analysieren, aber ich weiß es nicht. Wenn es mehr Informationen erforderlich ist, lassen Sie es mich wissen

EDIT: Ok, ich folgte dem Link, Xingxing Qiao Put - macht Sinn. Ich bekomme jetzt einen anderen Fehler, die ich denke, ist wegen dem, was ich in die Klasse gesteckt haben, dass die JSON deserialised in wird -

Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1[WindowsFormsApplication7.TrackingResponse]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.

To fix this error either change the JSON to a JSON array (e.g. [1,2,3]) or change the deserialized type so that it is a normal .NET type (e.g. not a primitive type like integer, not a collection type like an array or List) that can be deserialized from a JSON object. JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object.

Path 'Code', line 1, position 8.

Hier ist die Klasse ... ist es, weil ich nicht enthalten ' Code‘und‚Ergebnis‘aus dem JSON

public class TrackingResponse 
{ 
    public string ID { get; set; } 
    public string Reference { get; set; } 
    public string Asset { get; set; } 
    public string Event { get; set; } 
    public string DateEventStart { get; set; } 
    public string DateEvent { get; set; } 

} 
+0

überprüfen Sie dies, [convert-json-zu-Datentabelle] (http://stackoverflow.com/questions/11981282/convert-json-to-datatable) –

+0

Sieht aus wie ein Duplikat von [Deserialize ein verschachteltes DataSet von Json String mit Json.NET] (https://stackoverflow.com/a/42090584/3744182). Wie in dieser Antwort benötigen Sie ein Wrapper-Root-Objekt, das Ihre 'DataTable' enthält. Beantwortet das Ihre Frage ausreichend oder benötigen Sie das spezifische Root-Objekt? – dbc

+0

Danke @XingxingQiao, siehe meine weiteren Kommentare oben – reviloSlater

Antwort

3

Ihr Problem (string siehe oben) ist, dass Behälter Ihre Wurzel JSON kein Array ist, ist es ein Objekt ist. Wie in der JSON standard erläutert:

  • Ein Array ist eine geordnete Sammlung von Werten. Ein Array beginnt mit [ (linke Klammer) und endet mit ] (rechte Klammer). Werte werden durch , (Komma) getrennt.

  • Ein Objekt ist eine ungeordnete Gruppe von Name/Wert-Paaren. Ein Objekt beginnt mit { (linke Klammer) und endet mit } (rechte Klammer).

Newtonsoft abzubilden versucht, eine DataTable (sowie Objekte vom Typ IEnumerable, List, and Array) von und zu einem Array, und da der Stamm-Container kein Array ist, schlägt er mit der StartArray erwartet erhielt Startobject error .

Da Ihr Stammcontainer ein Objekt mit den beiden Eigenschaften "Code" und "Result" ist, müssen Sie ein POCO erstellen, an das diese Eigenschaften gebunden werden. Nun ist der Wert "Result" ein Array, also könnte ein DataTable oder ein List<T> für einige geeignete T zugeordnet werden.Um die notwendigen Klassen zu generieren, können Sie ein Code-Generierungs-Tool verwenden, wie http://json2csharp.com/ oder Paste JSON As Classes in Visual Studio und bekommen so etwas wie die folgende (leicht das Wurzelobjekt generisch zu machen modifiziert):

public class Result 
{ 
    public int ID { get; set; } 
    public string Reference { get; set; } 
    public int Asset { get; set; } 
    public int Event { get; set; } 
    public string DateEventStart { get; set; } 
    public string DateEvent { get; set; } 
} 

public class RootObject<T> 
{ 
    public int Code { get; set; } 
    public T Result { get; set; } 
} 

Sie können nun deserialisieren Ihre JSON als RootObject<DataTable> oder RootObject<List<Result>>:

var rootOfList = JsonConvert.DeserializeObject<RootObject<List<Result>>>(responsetext); 

oder

var rootOfTable = JsonConvert.DeserializeObject<RootObject<DataTable>>(responsetext); 
DataTable table = rootOfTable.Result; 

Probe fiddle.

+0

Das hat mir immens geholfen - sehr geschätzt (und danke, dass du es erklärt hast, anstatt hier nur einen Code zu kleben) – reviloSlater