2016-05-11 7 views
1

Ich versuche ein JSON-Objekt (ein Array) in eine generische Liste einer öffentlichen Klasse namens County zu deserialisieren. Hier ist ein Auszug aus dem JSON I erhalten:Das JSON-Objekt kann nicht deserialisiert werden, da es sich um ein schlecht formatiertes Array handelt

{ 
    "Alachua":0, 
    "Baker":1, 
    "Bay":2, 
    "Bradford":3, 
    "Brevard":4, 
    "Broward":5, 
    "Calhoun":6, 
    "Charlotte":7 
} 

Hier ist die Klasse:

<Serializable()> _ 
Public Class County 
    Private _name As String 
    Private _code As Integer 

    Public Property Code() As Integer 
     Get 
      Return Me._code 
     End Get 
     Set(value As Integer) 
      Me._code = value 
     End Set 
    End Property 

    Public Property Name() As String 
     Get 
      Return Me._name 
     End Get 
     Set(value As String) 
      Me._name = value 
     End Set 
    End Property 
End Class 

Da jedoch der JSON-Array nicht richtig formatiert ist, wie ich es normalerweise erwarten würde, kann ich es nicht bekommen zu serialisieren.

ich zur Zeit mit Newtonsoft:

Dim countyResponse As List(Of County) = ParseRequestJSON(Of List(Of County))(request) 

Und hier ist die Ausnahme:

kann nicht das aktuelle JSON-Objekt deserialisieren (zB { "name": "Wert"}) in dem Typen ‚System. Collections.Generic.List`1 [Models.County] ', 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 ein Integer, kein Sammlertyp wie ein Array oder eine Liste), die von 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 'Alachua', Linie 2, Position 12.

Jede Hilfe wäre willkommen, und bitte lassen Sie sich vom VB.net nicht abschrecken.

+1

Die Eingabe ist ein * richtig formatiertes * JSON-Objekt. Deserialisieren Sie es als eins (es kann einem IDictionary zugeordnet werden): dann konvertieren Sie es in ein Array wie vom Programm gefordert. – user2864740

+0

Sie haben Recht. Es ist korrekt formatiert. Es ist einfach nicht so, wie ich es erwartet hätte. –

+1

Jemand/etwas erzeugte den JSON-Eingang als solchen. Ein einfacher Verbraucher muss sich nur damit befassen; auch wenn es anders und/oder angemessener serialisiert werden könnte. Wenn auch der Produzent kontrolliert wird, könnten die Serialisierung und der Drahtvertrag geändert werden. – user2864740

Antwort

2

Dank @ user2864740 haben wir eine Antwort. Deserialisiert in ein IDictionary mit einem String Key und Integer Value. Ich fahre dann durch das IDictionary und füge die Counties zu einer Liste hinzu.

Dim countyResponse As IDictionary(Of String, Integer) = ParseRequestJSON(Of IDictionary(Of String, Integer))(request) 

If IsNothing(countyResponse) = False Then 
    For Each c In countyResponse 
     Dim county As County = New County 
     county.Code = c.Value 
     county.Name = c.Key 

     Counties.Add(county) 
    Next 
End If