2016-06-01 11 views
1

Webサイトからデータを取得し、アプリケーションのリストビューにあるフィールドの一部を取り込みたいとします。私はいくつかの記事を読んで、JavaScriptSerializerとJSON.Netのどちらかを選択するのは混乱します。これを解決する最善の方法は何ですか?VB.netでのJSON.Netの逆シリアル化

は、ここで私は、IDの値のみをしたいウェブサイト

{ 
"variations": { 
"variants": [ 
    {"id": "AQ5929_580", 
    "avStatusQuantity": 1.0, 
    "avStatus": "NOT_AVAILABLE", 
    "inStock": false, 
    "avLevels": {"IN_STOCK": 0.0, 
    "PREORDER": 0.0, 
    "BACKORDER": 0.0, 
    "NOT_AVAILABLE": 1.0, 
    "PREVIEW": 1.0}, 
    "ATS": 0.0, 
    "inStockDate": "Tue Jun 14 00:00:00 GMT 2016" 
    } 
    , 

    {"id": "AQ5929_590", 
    "avStatusQuantity": 1.0, 
    "avStatus": "NOT_AVAILABLE", 
    "inStock": false, 
    "avLevels": {"IN_STOCK": 0.0, 
    "PREORDER": 0.0, 
    "BACKORDER": 0.0, 
    "NOT_AVAILABLE": 1.0, 
    "PREVIEW": 1.0}, 
    "ATS": 0.0, 
    "inStockDate": "Tue Jun 14 00:00:00 GMT 2016" 
    } 
    , 

    {"id": "AQ5929_600", 
    "avStatusQuantity": 1.0, 
    "avStatus": "NOT_AVAILABLE", 
    "inStock": false, 
    "avLevels": {"IN_STOCK": 0.0, 
    "PREORDER": 0.0, 
    "BACKORDER": 0.0, 
    "NOT_AVAILABLE": 1.0, 
    "PREVIEW": 1.0}, 
    "ATS": 0.0, 
    "inStockDate": "Tue Jun 14 00:00:00 GMT 2016" 
    } 
    ] 
    } 
} 

からJSON応答で、INSTOCKは、フィールドをATS。これまで

私のVB .NETコードは、

<Serializable> _ 
Public Class Variants 
    Private _id As String = Nothing 
    Public Property id() As String 
     Get 
      Return _id 
     End Get 
     Set(value As String) 
      _id = value 
     End Set 
    End Property 

    Private _avStatusQuantity As Double 
    Public Property avStatusQuantity() As Double 
     Get 
      Return _avStatusQuantity 
     End Get 
     Set(value As Double) 
      _avStatusQuantity = value 
     End Set 
    End Property 

    Private _avStatus As String = Nothing 
    Public Property avStatus() As String 
     Get 
      Return _avStatus 
     End Get 
     Set(value As String) 
      _avStatus = value 
     End Set 
    End Property 

    Private _inStock As Boolean = False 
    Public Property inStock() As Boolean 
     Get 
      Return _inStock 
     End Get 
     Set(value As Boolean) 
      _inStock = value 
     End Set 
    End Property 

    Private _ATS As String = Nothing 
    Public Property ATS() As Double 
     Get 
      Return _ATS 
     End Get 
     Set(value As Double) 
      _ATS = value 
     End Set 
    End Property 

    Private _inStockDate As String = Nothing 
    Public Property inStockDate() As String 
     Get 
      Return _inStockDate 
     End Get 
     Set(value As String) 
      _inStockDate = value 
     End Set 
    End Property 
End Class 

<Serializable> _ 
Public Class Variations 
    Private _Variants As Variants 
    Public Property variants As Variants 
     Get 
      Return _Variants 
     End Get 
     Set(value As Variants) 
      _Variants = value 
     End Set 
    End Property 
End Class 

私はデシリアライズのためJSONConvert機能を使用し、結果は常に、私はより多くのソリューションを見てきた何

Dim x = JsonConvert.DeserializeObject(Of Variants)(Response) 
MessageBox.Show(x.id) 

ではありませんが、それらのほとんどは、 C#で、彼らは私を混乱させる。 誰かが私を助けることができるなら、 ありがとう!

答えて

2

に近い何かが必要な場合があります。あなたはあなたが欲しい部分を考えることができます:Container.variations.variant(N)。あなたはjsonで必要なものをラップする "variation {}"を見ることができ、次に最も外側の{ .. }が、直列化されたオブジェクトです。これはもう一つのクラスです。だから、:

Public Class VariationsContainer 
    Public Property variations As Variations 
End Class 
Public Class Variations 
    Public Property variants As MyVariant() 
End Class 

Public Class MyVariant 
    Public Property id As String 
    Public Property ATS As Double 
    Public Property inStockDate As String 
End Class 

VariantはVBのキーワードであるので、私はクラスのMyVariantを使用し、プロパティ名はJPropertyの使用を避けるためにJSONで使用されることがあります。その後:

Dim jstr As String = from whereever 

Dim jData = JsonConvert.DeserializeObject(Of VariationsContainer)(jstr) 
Console.WriteLine(jData.variations.variants(0).id) 

AQ5929_580


あなたがそれらの2つの他のクラスを定義したくない場合は、1-2以上のステップは、それらを取り除くだろうとどこにでもobj.variations.Variants()表記:

Dim jobj = JObject.Parse(jstr) 
Dim vars = JsonConvert.DeserializeObject(Of List(Of MyVariant))(jobj("variations")("variants").ToString) 
Console.WriteLine(vars(1).id) 

AQ5929_590

この結果、List(Of MyVariants)を使用してDeserializeObject(Of MyVariant())を返し、代わりに配列を取得します。 MSDN for JavaScriptSerializer Class

I'm confused to choose between JavaScriptSerializer and JSON.Net最初の言葉:。

Json.NETシリアル化と逆シリアル化を使用しなければならない[原文のまま]

+1

ありがとうございました。あなたのソリューションは別のプロジェクトでも役に立ちました:) – user3397557

0

正確なVBはわかりませんが、表示されているレスポンスは、Variantのコレクションではなく、単一のバリアントです。

は、あなたがしたい部分以外にもJSONで2他の「もの」があります

Dim x = JsonConvert.DeserializeObject(Of IEnumerable(Variants))(Response) 
For Each v as Variant In x 
//do stuff with each one. 
Next 
+0

私はこの以前の試み、これは私が取得エラーです: の未処理の例外タイプ 'Newtonsoft.Json。JsonSerializationException 'がNewtonsoft.Json.dllで発生しました 追加情報:現在のJSONオブジェクト({"name": "value"}など)を' System.Collections.Generic.IEnumerable'1 [Adidas_Stock_Checker.Variations] '型に逆シリアル化できませんそのタイプでは、正しくデシリアライズするためにJSON配列([1,2,3]など)が必要なためです。 – user3397557

+0

私はPlutonixの答えは完全な完全な答えだと思います。私は名前の 'バリエーション'コンテナに気付かなかった –

関連する問題