Naren
Naren

Reputation: 65

JSON Format Deserialize Error

I am new to manipulating JSON format data retrieved through an Web API. I'm using Newtonsoft.Json.JsonConvert to deserialize and assign to datatable.

This is the JSON data I am trying to get into a datatable.

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

I have created the below classes

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

Below is my VB.Net code:

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

Getting below error

"Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'Alco.APTIS.Services.RootObject' because the type requires a JSON object (e.g. {"name":"value"}) to deserialize correctly."

I have tried different ways to fix this using stackoverflow.com and finally posting here for help.

Upvotes: 0

Views: 1013

Answers (1)

dbc
dbc

Reputation: 117344

You have two unrelated issues.

Firstly, your root object doesn't match your JSON. If I copy your JSON into a code generator such as http://jsonutils.com/, I get the following, using a List(Of Legend) for the null atrSpaClassLegends property:

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 

Having done this, it is now possible to deserialize your JSON into a List(Of RootObject):

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

Note you must deserialize as a List(Of RootObject) (or similar .Net collection such as an array) since your top level JSON container is a JSON array -- an ordered comma-separated sequence of values surrounded by [ and ]. This is explained in the Json.NET Serialization Guide. Sample fiddle.

Secondly, despite having created these types, in the code shown in your question you are not using them at all! Instead, you are deserializing to a DataTable. And unfortunately the atrSpaCitieDistrict property is a nested object:

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

Json.NET does not support automatically deserializing column values that are complex objects into untyped data tables, and will throw an exception if one is encountered. Instead, you would need to deserialize into a typed data table. However, this may be a typo in your question; the exception error message indicates you are actually trying to deserialize into an object of type Alco.APTIS.Services.RootObject and not a DataTable.

Upvotes: 1

Related Questions