3

Web ソースから返された次の json を逆シリアル化しようとしています:

{
    "cards": [
    {
        "high": "8.27", 
        "volume": 5, 
        "percent_change": "0.00", 
        "name": "Wurmcoil engine", 
        "url": "http://blacklotusproject.com/cards/Scars+of+Mirrodin/Wurmcoil+Engine/", 
        "price": "6.81", 
        "set_code": "SOM", 
        "average": "5.67", 
        "change": "0.00", 
        "low": "1.12"}], 
        "currency": "USD"
    }

私は、Visual Basic で json.net を使用しています。これは、特に vb のオブジェクト指向部分の両方にとって新しいものです。「価格」変数を抽出したいだけです。私はそのようなクラスを設定しました:

Public Class Card
    Public high As String
    Public volume As String
    Public percent_change As String
    Public name As String
    Public url As String
    Public price As String
    Public set_code As String
    Public average As String
    Public change As String
    Public low As String
End Class

私が現在使用しているコードは次のとおりです。

Public Sub parse_json(url As String)
    Dim blp_json As String = ""
    Dim wClient As New WebClient
    wClient.Proxy = System.Net.HttpWebRequest.DefaultWebProxy
    blp_json = wClient.DownloadString(url)
    MessageBox.Show(blp_json)
    Dim card_1 = Newtonsoft.Json.JsonConvert.DeserializeObject(Of Card)(blp_json)
    PriceTextBox.Text = card_1.price
    TextBox1.AppendText(card_1.ToString)
    TextBox1.AppendText(blp_json)

End Sub

コツをつかむためにさまざまなことを試しているだけで、自分が何をしているのかよくわかりません。「価格」がカードにネストされているように見えるため、カードクラスが間違っていると思います:[{...}]

私はjsonのデシリアライズについてはまったく知りませんし、vbで/適切に/行う方法についてはあまり知りません。

4

1 に答える 1

0

System.Web.Script.Serialization.JavaScriptSerializerJSON の逆シリアル化に使用します。cardsJSONオブジェクトの配列が含まれているという事実により、例は少し複雑です。これは「[」と「]」で示されます。このコード例cardsは、配列であるかどうかに関係なく、それを処理する方法を示しています。Else常に配列が存在することが確実な場合は、無視することをお勧めします。cards

プロジェクトに System.Web.Extensions への参照が含まれていることを確認してください...

Imports System.Web.Script.Serialization

その後...

Dim MySerializer As JavaScriptSerializer = New JavaScriptSerializer()
Dim dictResult As Dictionary(Of String, Object) = MySerializer.Deserialize(Of Dictionary(Of String, Object))(blp_json)

Dim dictCard As Dictionary(Of String, Object)

If dictResult.ContainsKey("cards") Then

    If TypeOf dictResult("cards") Is ArrayList Then

        Dim arrResult As ArrayList = DirectCast(dictResult("cards"), ArrayList)

        For Each arrCardRecord In arrResult

            dictCard = DirectCast(arrCardRecord, Dictionary(Of String, Object))

            If dictCard.ContainsKey("price") Then Console.WriteLine(dictCard("price"))

        Next
    Else
        dictCard = DirectCast(dictResult("cards"), Dictionary(Of String, Object))
        If dictCard.ContainsKey("price") Then Console.WriteLine(dictCard("price"))
    End If

End If
于 2013-02-11T13:44:58.800 に答える