2016-05-11 1 views
1

J'essaie de désérialiser un objet JSON (qui est un tableau) dans une liste générique d'une classe publique appelée Comté. Voici un extrait du JSON que je reçois:Impossible de désérialiser un objet JSON, car il s'agit en réalité d'un tableau mal formaté

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

Voici la classe:

<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 

Cependant, parce que le tableau JSON est pas formaté correctement comment j'attendre normalement, je ne peux pas l'obtenir sérialiser.

J'utilise actuellement Newtonsoft:

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

Et voici l'exception:

ne peut désérialiser l'objet JSON en cours (par exemple { "name": "valeur"}) dans le Système type ». Collections.Generic.List`1 [Models.County] 'car le type requiert un tableau JSON (par exemple [1,2,3]) pour désérialiser correctement. Pour corriger cette erreur, changez le JSON en un tableau JSON (par exemple [1,2,3]) ou changez le type désérialisé pour qu'il soit un type .NET normal (par exemple, pas un type primitif comme un entier, pas un type de collection comme un tableau ou une liste) qui peut être désérialisé à partir d'un objet JSON. JsonObjectAttribute peut également être ajouté au type pour le forcer à désérialiser à partir d'un objet JSON. Chemin 'Alachua', ligne 2, position 12.

Toute aide serait appréciée, et s'il vous plaît ne soyez pas effrayé par le VB.net.

+1

L'entrée est un objet JSON * correctement formaté. Désérialisez-le en tant qu'un (il peut être mappé à un IDictionary): puis le convertir en un tableau tel que requis par le programme. – user2864740

+0

Vous avez raison. Il est correctement formaté. Ce n'est pas comme ça que je m'y attendais. –

+1

Quelqu'un/quelque chose a généré l'entrée JSON en tant que telle. Un simple consommateur a juste à faire avec; même s'il peut être sérialisé différemment et/ou de manière plus appropriée. Si elle contrôle également le producteur, la sérialisation et le contrat de fil peuvent être modifiés. – user2864740

Répondre

2

Grâce à @ user2864740 nous avons une réponse. Désérialisé dans un IDictionary avec une clé de chaîne et une valeur entière. Je parcours ensuite l'IDictionary et ajoute les comtés à une liste.

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