2016-10-17 2 views
0

Je suis nouveau dans la manipulation des données au format JSON récupérées via une API Web. J'utilise Newtonsoft.Json.JsonConvert pour désérialiser et affecter à datatable.Erreur de formatage du format JSON

Ce sont les données JSON que j'essaie d'obtenir dans une datatable.

[{ 
"classDesc":"SIDEWALK,DRIVEWAY,CURB", 
"classCode":"EH", 
"legend":"017", 
"isActive":"Y", 
"atrSpaCityDistrictId":"00D17209F8F25F6D4A00011302", 
"atrSpaCitieDistrict":{ 
"cityDistrict":"", 
"isActive":"1", 
"atrSpaClassLegends":null, 
"id":"00D17209F8F25F6D4A00011302" 
}, 
"id":"00D1748B8DA0AB0A7400011202" 
}] 

J'ai créé les classes ci-dessous

Public Class RootObject 
    Public Property classDesc As String 
    Public Property classCode As String 
    Public Property id As Integer 
    Public Property legend As Integer 
    Public Property isActive As String 
    Public Property atrSpaCityDistrictId As Integer 
    Public Property atrSpaCitieDistrict As List(Of Result) End Class 

Public Class Result  
    Public Property cityDistrict As String 
    Public Property isActive As Integer 
    Public Property atrSpaClassLegends As List(Of Legend) 
    Public Property id As Integer 
End Class 

Public Class Legend 
End Class 

Ci-dessous mon code VB.Net:

Dim table As DataTable Dim client As New HttpClient() client.BaseAddress = New Uri("http://localhost:5000/") client.DefaultRequestHeaders.Accept.Add(New MediaTypeWithQualityHeaderValue("application/json")) 
Dim response As HttpResponseMessage = client.GetAsync("api/spaclasslegend").Result 
If response.IsSuccessStatusCode Then 
    Dim json As String = response.Content.ReadAsStringAsync().Result table = JsonConvert.DeserializeObject(Of DataTable)(json) 
End If 

erreur ci-dessous Obtenir

« ne peut pas désérialiser le JSON en cours tableau (par exemple [1,2,3]) dans le type 'Alco.APTIS.Services.RootObject' car le type requiert un objet JSON (par ex. { « Name »: « valeur »}.) Désérialiser correctement »

J'ai essayé différentes façons de résoudre ce en utilisant stackoverflow.com et enfin l'affichage ici pour aider

+0

Vérifiez le contenu de votre variable de chaîne 'json'. Le message d'erreur indique que vous essayez de désérialiser un objet à partir d'un tableau JSON. (Par exemple, votre service Web peut retourner un tableau contenant un objet.) – pmcoltrane

+0

Merci beaucoup pour votre réponse rapide. J'ai posté ma chaîne JSON. Pourriez-vous s'il-vous-plaît vérifier? – Naren

+0

En fait, je n'obtiens pas l'erreur que vous listez lorsque je lance une version minimale du code. Je reçois une erreur de jeton inattendue quand il essaie d'analyser 'atrSpaCitieDistrict'. Le convertisseur 'DataTable' de JSON.NET prend-il en charge des objets complexes? – pmcoltrane

Répondre

1

Vous avez deux questions sans rapport.. .

Tout d'abord, votre objet racine ne correspond pas à votre JSON Si je copie votre JSON dans un générateur de code tel que http://jsonutils.com/, je reçois ce qui suit, en utilisant un List(Of Legend) pour le null atrSpaClassLegends propriété:

Public Class AtrSpaCitieDistrict 
    Public Property cityDistrict As String 
    Public Property isActive As String 
    Public Property atrSpaClassLegends As List(Of Legend) 
    Public Property id As String 
End Class 

Public Class RootObject 
    Public Property classDesc As String 
    Public Property classCode As String 
    Public Property legend As String 
    Public Property isActive As String 
    Public Property atrSpaCityDistrictId As String 
    Public Property atrSpaCitieDistrict As AtrSpaCitieDistrict 
    Public Property id As String 
End Class 

Public Class Legend 
End Class 

Après avoir fait cela, il est maintenant possible de désérialiser votre JSON dans un List(Of RootObject):

Dim root = JsonConvert.DeserializeObject(Of List(Of RootObject))(jsonString) 

Remarque vous devez désérialiser comme List(Of RootObject) (ou similaire collection .Net, comme un tableau) depuis votre haut niveau JSON conteneur est un tableau JSON - une séquence ordonnée de valeurs séparées par des virgules entourées par [ et ]. Ceci est expliqué dans le Json.NET Serialization Guide. Echantillon fiddle. Deuxièmement, malgré avoir créé ces types, dans le code montré dans votre question, vous ne les utilisez pas du tout! Au lieu de cela, vous désérialisez à DataTable. Et malheureusement, la atrSpaCitieDistrict propriété est un objet imbriqué:

{ 
    "atrSpaCitieDistrict": { 
     "cityDistrict": "", 
     "isActive": "1", 
     "atrSpaClassLegends": null, 
     "id": "00D17209F8F25F6D4A00011302" 
    }, 
    } 

Json.NET ne supporte pas désérialisation automatiquement les valeurs des colonnes qui sont des objets complexes dans des tables de données non typées et lancera une exception si l'on se rencontre. Au lieu de cela, vous devez désérialiser dans un tableau de données typé. Cependant, ceci peut être une faute de frappe dans votre question; le message d'erreur d'exception indique que vous essayez réellement de désérialiser en un objet de type Alco.APTIS.Services.RootObject et non un DataTable.