2016-11-14 4 views
0

Ich versuche, das folgende JSON-Objekt deserialise aber einen Fehler bekommen, möchte ich tun, um die json in aC# Liste setzen:C# Newtonsoft.Json DeserializeObject Fehler

public class CardTextModel 
{ 
    public string prod_Code { get; set; } 
    public string page1Text { get; set; } 
    public string insideText { get; set; } 
    public string userName { get; set; } 
    public Nullable<System.DateTime> exportDate { get; set; } 
    public List<CardTextModel> card_Text { get; set; } 
} 

Hier ist, wo ich versuche, JSON-

class Program 
{ 
    static void Main(string[] args) 
    { 
     try 
     { 
      var content = @"{ 
       ""card_Text"": [ 
       { 
        ""prod_Code"": ""G01Q0320WS"", 
        ""page1Text"": ""SHORTY SET SZ 10"", 
        ""insideText"": ""SHORTY SET SZ 10"", 
        ""userName"": ""daz"", 
        ""exportDate"": null 
       }, 
       { 
        ""prod_Code"": ""G01Q0380"", 
        ""page1Text"": ""TREE DECS SET 4 RESIN"", 
        ""insideText"": ""TREE DECS SET 4 RESIN"", 
        ""userName"": ""mark"", 
        ""exportDate"": null 
       } 
       ] 
      }"; 

      var model = JsonConvert.DeserializeObject<List<CardTextModel>>(content); 
     } 
     catch (Exception ex) 
     { 

     } 
    } 
} 

deserialise ich die folgende Störung erhalte, wenn ich versuche, meine json Objekt deserize

Kann nicht deserialisieren das aktuelle JSON-Objekt (z.B. {"name": "value"}) in den Typ 'System.Collections.Generic.List`1 [CardTextModel]', da der Typ ein JSON-Array (z. B. [1,2,3]) benötigt, um korrekt zu deserialisieren. Um diesen Fehler zu beheben, ändern Sie den JSON entweder in ein JSON-Array (zB [1,2,3]) oder ändern Sie den deserialisierten Typ so, dass es ein normaler .NET-Typ ist (zB kein primitiver Typ wie Integer, kein Collection-Typ) wie ein Array oder eine Liste), die aus einem JSON-Objekt deserialisiert werden können. JsonObjectAttribute kann auch zum Typ hinzugefügt werden, um die Deserialisierung von einem JSON-Objekt zu erzwingen. Pfad 'card_Text', Zeile 2, Position 30.

Ich bin mit Newtonsoft.Json 9.0.0.0

Vielen Dank für jede Hilfe

+1

Sie haben genau das gleiche Problem wie dieser Typ http://stackoverflow.com/questions/40585221/deserialize-json-to-an-array-of-objects-instead-of-to-one-object-list. Sie versuchen, JSON-Objekt zu einer Liste zu deserialisieren, was nicht möglich ist. Sie müssen also entweder Ihre JSON-Datei so ändern, dass sie zu einem Array wird, oder Sie verwenden sie zur Analyse, um sie zu analysieren: http://stackoverflow.com/a/40585655/6356434. – Alex

Antwort

1

Ihre json sollte wie folgt aussehen:

var content = @"[ 
       { 
        ""prod_Code"": ""G01Q0320WS"", 
        ""page1Text"": ""SHORTY SET SZ 10"", 
        ""insideText"": ""SHORTY SET SZ 10"", 
        ""userName"": ""daz"", 
        ""exportDate"": null 
       }, 
       { 
        ""prod_Code"": ""G01Q0380"", 
        ""page1Text"": ""TREE DECS SET 4 RESIN"", 
        ""insideText"": ""TREE DECS SET 4 RESIN"", 
        ""userName"": ""mark"", 
        ""exportDate"": null 
       } 
       ]"; 

var model = JsonConvert.DeserializeObject<List<CardTextModel>>(content); 

Oder Ihr Objekt muss geändert werden, um das Stammelement card_Text zu unterstützen.

public class CardTextModel 
{ 
    public string prod_Code { get; set; } 
    public string page1Text { get; set; } 
    public string insideText { get; set; } 
    public string userName { get; set; } 
    public Nullable<System.DateTime> exportDate { get; set; } 
    public List<CardTextModel> card_Text { get; set; } 
} 

public class CardTextModelRoot 
{ 
    public List<CardTextModel> card_Text {get;set;} 
} 

var content = @"{ 
     ""card_Text"": [ 
     { 
      ""prod_Code"": ""G01Q0320WS"", 
      ""page1Text"": ""SHORTY SET SZ 10"", 
      ""insideText"": ""SHORTY SET SZ 10"", 
      ""userName"": ""daz"", 
      ""exportDate"": null 
     }, 
     { 
      ""prod_Code"": ""G01Q0380"", 
      ""page1Text"": ""TREE DECS SET 4 RESIN"", 
      ""insideText"": ""TREE DECS SET 4 RESIN"", 
      ""userName"": ""mark"", 
      ""exportDate"": null 
     } 
     ] 
    }"; 

var model = JsonConvert.DeserializeObject<CardTextModelRoot>(content); 
+0

Hallo Amir, ich habe deinen genauen Code kopiert und bekomme trotzdem den gleichen Fehler. Irgendeine Hilfe? Ich möchte das Root-Element beibehalten, als wenn ich das Objekt serialisieren card_Text hinzugefügt wird – user142617

+0

Der Code funktioniert - ich habe es getestet. –

+0

Danke allen, Amir Lösung arbeitete – user142617

1

Sein, weil in Ihrem json haben Sie eine Eigenschaft card_Text, die mit dem Array zugeordnet ist. Ändern Sie entweder Ihren JSON oder fügen Sie eine Stub-Klasse hinzu, die dasselbe tut.


Modified Code

public class ModelHolder{ 
    public List<CardTextModel> card_Text {get;set;} 
} 

In Ihrem Deserialisierung Code

var model = JsonConvert.DeserializeObject<ModelHolder>(content); 

Modified json

var content = @"[ 
    { 
     ""prod_Code"": ""G01Q0320WS"", 
     ""page1Text"": ""SHORTY SET SZ 10"", 
     ""insideText"": ""SHORTY SET SZ 10"", 
     ""userName"": ""daz"", 
     ""exportDate"": null 
    }, 
    { 
     ""prod_Code"": ""G01Q0380"", 
     ""page1Text"": ""TREE DECS SET 4 RESIN"", 
     ""insideText"": ""TREE DECS SET 4 RESIN"", 
     ""userName"": ""mark"", 
     ""exportDate"": null 
    } 
    ]"; 
0

Y Unser Inhalt ist kein Array, sondern ein JSON-Objekt, das ein Feld "card_Text" enthält, das das Array enthält, nach dem Sie suchen.

der Typparameter DeserializeObject modifizieren, um eine Klasse zu sein, wie

class CardTextWrapperModel 
{ 
    public List<CardTextModel> card_Text { get; set; } 
} 

oder das Array passieren direkt ohne das äußere Objekt:

var content = @"[ 
      { 
       ""prod_Code"": ""G01Q0320WS"", 
       ""page1Text"": ""SHORTY SET SZ 10"", 
       ""insideText"": ""SHORTY SET SZ 10"", 
       ""userName"": ""daz"", 
       ""exportDate"": null 
      }, 
      { 
       ""prod_Code"": ""G01Q0380"", 
       ""page1Text"": ""TREE DECS SET 4 RESIN"", 
       ""insideText"": ""TREE DECS SET 4 RESIN"", 
       ""userName"": ""mark"", 
       ""exportDate"": null 
      } 
      ]"; 
0

Ihre JSON kein Array, ist es ein Objekt, das eine Eigenschaft namens "card_Text" hat, die ein Array ist. Try this:

public class CardsModel 
    { 
     public List<CardTextModel> card_Text { get; set; } 
    } 
    public class CardTextModel 
    { 
     public string prod_Code { get; set; } 
     public string page1Text { get; set; } 
     public string insideText { get; set; } 
     public string userName { get; set; } 
     public Nullable<System.DateTime> exportDate { get; set; } 
     public List<CardTextModel> card_Text { get; set; } 
    } 


var model = JsonConvert.DeserializeObject<CardsModel>(content); 
+0

Die Card_Text Eigenschaft in CardTextModel ist nutzlos –

+0

@SirRufo warum ist es nutzlos? Es spiegelt den JSON wider. –

+0

Immer noch den gleichen Fehler? – user142617

0

weiter, um den Prozessablauf zu verstehen, Sie können sich entscheiden, um die Kompatibilität des Objekts auf die tatsächliche JSON Konvertierung zu testen. Versuchen Sie, die JSON-Zeichenfolge aus einer Liste von "CardTextModel" -Objekten zu generieren.

var cardList = new List<CardTextModel>(){ 
    new CardTextModel{ 
     prod_Code = "G01Q0320WS", 
     page1Text = "SHORTY SET SZ 10", 
     insideText = "SHORTY SET SZ 10", 
     userName = "daz", 
     exportDate = null 
    }, 
    new CardTextModel{ 
     prod_Code = "G01Q0380", 
     page1Text = "TREE DECS SET 4 RESIN", 
     insideText = "TREE DECS SET 4 RESIN", 
     userName = "mark", 
     exportDate = null 
    }, 
}; 

string output = JsonConvert.SerializeObject(cardList); 

würde der Ausgang sein:

"[{\"prod_Code\":\"G01Q0320WS\",\"page1Text\":\"SHORTY SET SZ 10\",\"insideText\":\"SHORTY SET SZ 10\",\"userName\":\"daz\",\"exportDate\":null},{\"prod_Code\":\"G01Q0380\",\"page1Text\":\"TREE DECS SET 4 RESIN\",\"insideText\":\"TREE DECS SET 4 RESIN\",\"userName\":\"mark\",\"exportDate\":null}]" 

Daher konnten wir nun die Ausgabe als Basis verwenden. Zurück zu Ihrer Frage, hier ist der eigentliche Code. dies hilft

enter image description here

Hoffnung:

class Program 
    { 
     static void Main(string[] args) 
     { 
      var content = "[{\"prod_Code\":\"G01Q0320WS\",\"page1Text\":\"SHORTY SET SZ 10\",\"insideText\":\"SHORTY SET SZ 10\",\"userName\":\"daz\",\"exportDate\":null},{\"prod_Code\":\"G01Q0380\",\"page1Text\":\"TREE DECS SET 4 RESIN\",\"insideText\":\"TREE DECS SET 4 RESIN\",\"userName\":\"mark\",\"exportDate\":null}]"; 

      var model = JsonConvert.DeserializeObject<List<CardTextModel>>(content); 
     } 
    } 

Der Wert des Modells sein sollte! :)

0

Nicht sicher (keine Zeit zu überprüfen), aber ich hoffe, es hilft. Versuchen:

using System.Runtime.Serialization; 
using System.Collections.Generic; 
using System.Runtime.Serialization.Json; 
... 
[DataContract] 
public class CardText 
{ 
    [DataMember] 
    public string prod_Code { get; set; } 
    [DataMember] 
    public string page1Text { get; set; } 
    [DataMember] 
    public string insideText { get; set; } 
    [DataMember] 
    public string userName { get; set; } 
    [DataMember] 
    public object exportDate { get; set; } 
} 

[DataContract] 
public class CardTextRootObject 
{ 
    [DataMember] 
    public List<CardText> card_Text { get; set; } 
} 
... 
    private T parseJSON<T>(string content) 
    { 
     using (MemoryStream stream = new MemoryStream()) 
     { 
      using (StreamWriter writer = new StreamWriter(stream)) 
      { 
       writer.Write(content); 
       writer.Flush(); 
       stream.Position = 0; 

       DataContractJsonSerializer JSONSer = new DataContractJsonSerializer(typeof(T)); 

       return (T)JSONSer.ReadObject(stream); 
      } 
     } 
    } 

... 
var deserializedJSONobj = parseJSON<CardTextRootObject>(content); 
... 

Realy hoffe, es hilft)).

Verwandte Themen