Ich habe eine JSON-Zeichenfolge.

[  
 {  
  "target":"FDOL00001",
  "datapoints":[  
     {  
        "y":72.564,
        "x":1523858700
     }
  ]
 },
 {  
  "target":"FDOL00001",
  "datapoints":[  
     {  
        "y":86.366,
        "x":1523858700
     }
  ]
 },
 {  
  "target":"FDOL00001",
  "datapoints":[  
     {  
        "y":73.90195818815343,
        "x":1523858700
     }
  ]
 }
]

Ich versuche es zu einer Sammlung zu deserialisieren. Aber ich bekomme einen Fehler. Kann mich jemand auf den richtigen Weg bringen, um das zu beheben?

class datapoint
{
    [JsonProperty("x")]
    public int x { get; set; }
    [JsonProperty("y")]
    public decimal y { get; set; }
}
class jsonMapper
{
    [JsonProperty("target")]
    public string target { get; set; }
    [JsonProperty("datapoints")]
    public datapoint datapoints { get; set; }
}

Ich versuche mit dem folgenden Code zu konvertieren.

var json = JsonConvert.DeserializeObject<List<jsonMapper>>(objText);

Der Fehler, den ich bekomme, ist

Das aktuelle JSON-Array (z. B. [1,2,3]) kann nicht in den Typ 'ISSPortal2.datapoint' deserialisiert werden, da für den Typ ein JSON-Objekt (z. B. {"Name": "Wert"}) erforderlich ist, um die Deserialisierung korrekt durchzuführen. \ r \ nUm diesen Fehler zu beheben, ändern Sie entweder den JSON in ein JSON-Objekt (z. B. {"Name": "Wert"}) oder den deserialisierten Typ in ein Array oder einen Typ, der eine Sammlungsschnittstelle implementiert (z. B. ICollection) , IList) wie List, die aus einem JSON-Array deserialisiert werden kann. JsonArrayAttribute kann dem Typ auch hinzugefügt werden, um die Deserialisierung von einem JSON-Array zu erzwingen. \ R \ nPfad '[0] .datapoints', Zeile 1, Position 40.

Ich habe bereits dies überprüft. Aber es funktioniert nicht. Was ist falsch in meinem Code. Bitte helfen Sie mir, das zu identifizieren. Danke im Voraus :)

4
Jyothish Bhaskaran 18 Apr. 2018 im 12:08

4 Antworten

Beste Antwort

Sie versuchen, das Array datapoint[] in datapoint zu deserialisieren.

Veränderung

public datapoint datapoints { get; set; }

Zu

public datapoint[] datapoints { get; set; }

Bonus: C # -Namenskonventionen empfehlen Ihnen, Großbuchstaben in öffentlichen Objekten zu verwenden.

class Datapoint
{
    [JsonProperty("x")]
    public int X { get; set; }
    [JsonProperty("y")]
    public decimal Y { get; set; }
}
class JsonMapper
{
    [JsonProperty("target")]
    public string Target { get; set; }
    [JsonProperty("datapoints")]
    public Datapoint Datapoints { get; set; }
}
1
Orel Eraki 18 Apr. 2018 im 09:13

Sie müssen datapoints als eine Sammlung einer Art deklarieren (z. B. eine IEnumerable oder eine IList).

class jsonMapper
{
    [JsonProperty("target")]
    public string target { get; set; }

    // This has changed to IEnumerable<datapoint>
    [JsonProperty("datapoints")]
    public IEnumerable<datapoint> datapoints { get; set; }
}
1
RB. 18 Apr. 2018 im 09:13

Ihre Klassen sollten so sein:

public class datapoint
{
    [JsonProperty("x")]
    public int x { get; set; }
    [JsonProperty("y")]
    public decimal y { get; set; }
}
public class jsonMapper
{
    [JsonProperty("target")]
    public string target { get; set; }
    [JsonProperty("datapoints")]
    public List<datapoint> datapoints { get; set; }
}
0
Gaurang Dave 18 Apr. 2018 im 09:13

In Ihrer JSON-Zeichenfolge wird die Eigenschaft datapoints für jedes jsonMapper Objekt in eckige Klammern ([]) eingeschlossen, und dann wird datapoints als Sammlungsobjekt anstelle eines einzelnen Objekts interpretiert. Ihre jsonMapper-Klasse ist

class jsonMapper
{
    [JsonProperty("target")]
    public string target { get; set; }
    [JsonProperty("datapoints")]
    public datapoint datapoints { get; set; }
}

Und die Eigenschaft datapoints ist kein Array oder Sammlungsobjekt.

Sie können Ihre Eigenschaft von public datapoint datapoints { get; set; }; in
ändern public List<datapoint> datapoints { get; set; }; oder Sie können eckige Klammern ([]) aus Ihrer JSON-Zeichenfolge entfernen.

0
Chandra Ari Gunawan 18 Apr. 2018 im 09:19