2016-10-17 11 views
0

Web APIで取得したJSON形式のデータを操作するのが初めてです。私はNewtonsoft.Json.JsonConvertを使用してデシリアライズし、データテーブルに割り当てます。JSON形式デシリアライズエラー

これは、私がデータテーブルに入れようとしているJSONデータです。私は以下のクラス以下は

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 

を作成している

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

は私の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 

はエラー

「の下に取得すると、現在のJSONをデシリアライズすることはできません配列に配列(例:[1,2,3]) 0 'Alco.APTIS.Services.RootObject'型ではJSON オブジェクトが必要です(例: {「名」:「値」})が正しくデシリアライズする「

私はstackoverflow.com、最終的に助けを求めてここに投稿を使用してこの問題を解決するさまざまな方法を試してみました

+0

'json'文字列変数の内容を確認してください。このエラーメッセージは、JSON配列からオブジェクトを逆シリアル化しようとしていることを示しています。 (たとえば、Webサービスがオブジェクトを含む配列を返している可能性があります) – pmcoltrane

+0

すばらしい応答をいただきありがとうございます。 JSON文字列を投稿しました。確認していただけますか? – Naren

+0

実際には、最小限のバージョンのコードを実行したときに表示されるエラーは表示されません。 'atrSpaCitieDistrict'をパースしようとすると予期しないトークンエラーが発生します。 JSON.NETの 'DataTable'コンバータは複雑なオブジェクトをサポートしていますか? – pmcoltrane

答えて

1

あなたは2つの無関係な問題を抱えています。。。 。

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 

まず、あなたのルートオブジェクトは、あなたのJSONと一致していない私は、コード・ジェネレータなどhttp://jsonutils.com/にあなたのJSONをコピーする場合、私はnullをatrSpaClassLegendsプロパティをList(Of Legend)を使用して、以下を得ます

はこれを行った、List(Of RootObject)にあなたのJSONをデシリアライズすることが可能になりました:

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

あなたはList(Of RootObject)(あるいは、そのような配列と同様の純コレクション)としてデシリアライズする必要がありますあなたのトップレベルのJSONので、コンテナはJSON配列です。コンマで区切られた値のシーケンスは、[]で囲まれています。これはJson.NET Serialization Guideで説明されています。サンプルfiddle

第2に、これらのタイプを作成したにもかかわらず、あなたの質問に示されているコードでは、それらをまったく使用していません!代わりに、DataTableにデシリアライズしています。そして、残念ながらatrSpaCitieDistrictプロパティは、ネストされたオブジェクトです:

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

Json.NETは、型指定されていないデータテーブルに複雑なオブジェクトである列の値をデシリアライズ自動的にサポートしていない、と1に遭遇した場合に例外をスローします。代わりに、型変換されたデータ表に逆直列化する必要があります。しかし、これはあなたの質問のタイプミスかもしれません。例外エラーメッセージは、実際にタイプAlco.APTIS.Services.RootObjectで、DataTableではないオブジェクトに逆シリアル化しようとしていることを示しています。