2

私は ASP.NET で VB を使用しています。以下の JSON を約 4 日間逆シリアル化しようとしていますが、成功していません。

問題は、以下のコードが null 値を返すことです。各製品の価格と送料の値を含む、宣言した各クラス メンバーの JSON の結果を取得したいと考えています。

誰かが私を正しい方向に向けることができますか

1.) null 値が返される理由と

2.) 宣言したクラスが、逆シリアル化しようとしている json に対して有効な場合は?

どんな助けでも大歓迎です!

以下は、私が使用している JSON の例です。

{
 "kind": "shopping#products",
 "items": 
   [{
   "kind": "shopping#product",
   "id": "tag:google.com,2010:shopping/products/8040/8382012077897342942",
   "product": {
    "googleId": "8382012077897342942",
    "title": "LEGO Star Wars™: Jabba's Palace™ (9516)",
    "description": "Rescue Han Solo from Jabba the Hutt's desert palace!",
    "inventories": [
     {
      "price": 119.99,
      "shipping": 12.95,
      "currency": "USD"
     }
    ]
   }
  }
 ]
}

これが私が現在持っているコードです:

Imports System.Web.Script.Serialization
Imports Newtonsoft.Json.Linq

Public Class inventories
    Public Property price As Double
    Public Property shipping As Double
End Class

Public Class product
    Public Property googleid As String
    Public Property title As String
    Public Inventories As inventories()
End Class

Public Class Items
    Public Property product As product()
    Public Property kind As String
    Public Property id As String
End Class


Partial Class JSON_Test
    Inherits System.Web.UI.Page

    Protected Sub getbutton_Click(sender As Object, e As System.EventArgs) Handles getbutton.Click

        ' 1. Get JSON string from Google
        Dim google_json_string As String
        google_json_string = json_text.Text


        '2. Deserialize JSON - Method 1
        Dim jss As New JavaScriptSerializer
        Dim ds_results = jss.Deserialize(Of List(Of Items))(google_json_string)
        result1.Text = ds_results.Count
        result2.Text = ds_results(0).kind

    End Sub
End Class

(更新) 次のような構造のクラスを含めるようにコードを更新しました (ありがとう、Dan-o):

Public Class g_JSON
    Public Property items As List(Of Items)
End Class

Public Class Items
    Public Property product As product()
    Public Property kind As String
    Public Property id As String
End Class

Public Class product
    Public Property googleid As String
    Public Property title As String
    Public Inventories As inventories()
End Class

Public Class inventories
    Public Property price As Double
    Public Property shipping As Double
End Class

また、コードを次のように更新しました。

Partial Class JSON_Test
    Inherits System.Web.UI.Page

    Protected Sub getbutton_Click(sender As Object, e As System.EventArgs) Handles getbutton.Click

        ' 1. Get JSON string from Google
        Dim google_json_string As String
        google_json_string = json_text.Text


        '2. Deserialize JSON - Method 1
        Dim jss As New JavaScriptSerializer
        Dim ds_results = jss.Deserialize(Of g_JSON)(google_json_string)
        result1.Text = ds_results.items(0).id
        result2.Text = ds_results.items(0).kind

    End Sub
End Class

これで、コードは問題なくコンパイルされますが、クリック イベントを開始すると、次のエラーが発生します。

'product[]' の型に対して定義されたパラメーターなしのコンストラクターがありません。

説明: 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。

例外の詳細: System.MissingMethodException: 'product[]' の型に対して定義されたパラメーターなしのコンストラクターがありません。

ソース エラー: 38 行目: Dim ds_results = jss.Deserialize(Of g_JSON)(google_json_string)

これはどういう意味ですか? product() のパラメーターなしのコンストラクターを作成するにはどうすればよいですか?

ご覧いただきありがとうございます。

4

2 に答える 2

2

jsonlintによると、json は有効ではありません (「inventories」配列の後のカンマ)。

于 2013-03-15T08:12:28.633 に答える
1

あなたはコンテナを忘れました..すべてを保持するクラス...

Class something
  Public property kind as string = String.Empty

  Public property items as list(of Item) = Nothing
End Class

something次に、(アイテムの)リストではなく、にデシリアライズします

于 2013-03-15T08:02:38.003 に答える