1

Google マップ API に似たいくつかの方向 API によって返された json を逆シリアル化しようとしています。私のJSONは次のとおりです(私はVB.NET 2008を使用しています):

jsontext = { "version":0.3, "status":0, "route_summary": { "total_distance":300, "total_time":14, "start_point":"43", "end_point":"42" }, " route_geometry":[[51.025421,18.647631],[51.026131,18.6471],[51.027802,18.645639]], "route_instructions": [["43 を北西に向かう",88,0,4,"88 m","NW" ,334.8],["42 を続ける",212,1,10,"0.2 km","NW",331.1,"C",356.3]] }

これまでのところ、次のコードを思いつきました。

Dim js As New System.Web.Script.Serialization.JavaScriptSerializer
Dim lstTextAreas As Output_CloudMade() = js.Deserialize(Of Output_CloudMade())(jsontext)

複雑なクラス、つまり Output_CloudMade を定義する方法がわかりません。

私は次のようなことを試みています:

Public Class RouteSummary
    Private mTotalDist As Long
    Private mTotalTime As Long
    Private mStartPoint As String
    Private mEndPoint As String


    Public Property TotalDist() As Long
        Get
            Return mTotalDist
        End Get
        Set(ByVal value As Long)
            mTotalDist = value
        End Set
    End Property

    Public Property TotalTime() As Long
        Get
            Return mTotalTime
        End Get
        Set(ByVal value As Long)
            mTotalTime = value
        End Set
    End Property

    Public Property StartPoint() As String
        Get
            Return mStartPoint
        End Get
        Set(ByVal value As String)
            mStartPoint = value
        End Set
    End Property

    Public Property EndPoint() As String
        Get
            Return mEndPoint
        End Get
        Set(ByVal value As String)
            mEndPoint = value
        End Set
    End Property

End Class

Public Class Output_CloudMade

    Private mVersion As Double
    Private mStatus As Long
    Private mRSummary As RouteSummary
    'Private mRGeometry As RouteGeometry
    'Private mRInstructions As RouteInstructions

    Public Property Version() As Double
        Get
            Return mVersion
        End Get
        Set(ByVal value As Double)
            mVersion = value
        End Set
    End Property

    Public Property Status() As Long
        Get
            Return mStatus
        End Get
        Set(ByVal value As Long)
            mStatus = value
        End Set
    End Property

    Public Property Summary() As RouteSummary
        Get
            Return mRSummary
        End Get
        Set(ByVal value As RouteSummary)
            mRSummary = value
        End Set
    End Property


    'Public Property Geometry() As String
    '    Get

    '    End Get
    '    Set(ByVal value As String)

    '    End Set
    'End Property

    'Public Property Instructions() As String
    '    Get

    '    End Get
    '    Set(ByVal value As String)

    '    End Set
    'End Property

End Class

しかし、それは機能しません。問題は、route_summary のような複雑なプロパティにあります。「何もない」に満ちている。「ステータス」や「バージョン」などの他のプロパティは適切に入力されます。

上記の JSON のクラスを定義する方法はありますか?

VB.NET で JSON を逆シリアル化するための実用的なコードを共有できますか?

ありがとう、

4

1 に答える 1

2

以下は、JSON の受信ストリームを受け取り、指定したオブジェクトに変換するサンプルの Converter クラスです。以下のコードは .Net 4.0 であることに注意してください。4 の JSON シリアライザーは、はるかに使いやすくなっています。4 を使用できない場合はお知らせください。3.5 バージョンを掘り起こすことができるかどうかを確認します。基本的に、JSON をクラスにマップするには、クラス構造を作成する必要があります。Route および RouteSummary クラスを作成しました。route_geometry と route_instructions をオブジェクトとして残しました。それぞれのクラス定義を作成する必要がありますが、これで開始できます。

Imports System.IO
Imports System.Runtime.Serialization.Json
Imports System.Runtime.Serialization

<DataContract(Namespace:="")> _
Public Class Route

    <DataMember(Name:="version")>
    Public Property version As Double

    <DataMember(Name:="status")>
    Public Property status As Double

    <DataMember(Name:="route_summary")>
    Public Property route_summary As route_summary

    <DataMember(Name:="route_geometry")>
    Public Property route_geometry As Object()

    <DataMember(Name:="route_instructions")>
    Public Property route_instructions() As Object

End Class

<DataContract(Name:="route_summary", Namespace:="")> _
Public Class route_summary
    <DataMember(Name:="total_distance")>
    Public Property total_distance As Double

    <DataMember(Name:="total_time")>
    Public Property total_time As Double

    <DataMember(Name:="start_point")>
    Public Property start_point As Double

    <DataMember(Name:="end_point")>
    Public Property end_point As Double
End Class

Public Class Converter(Of t)
    Public Function ReturnJSON(ByRef sreader As StreamReader) As t
        If GetType(t).Equals(GetType(String)) Then
            Dim result As Object = sreader.ReadToEnd.Replace("""", "")
            Return result
        Else
            Dim ds As New DataContractJsonSerializer(GetType(t))
            Dim result As t = DirectCast(ds.ReadObject(sreader.BaseStream), t)
            ds = Nothing
            Return result
        End If
    End Function
End Class

    Sub Main()
        Dim json As String = "{""version"":0.3, ""status"":0, ""route_summary"": { ""total_distance"":300, ""total_time"":14, ""start_point"":""43"", ""end_point"":""42"" }, ""route_geometry"":[[51.025421,18.647631],[51.026131,18.6471],[51.027802,18.645639]], ""route_instructions"": [[""Head northwest on 43"",88,0,4,""88 m"",""NW"",334.8],[""Continue on 42"",212,1,10,""0.2 km"",""NW"",331.1,""C"",356.3]]}"

        Dim encoding As New System.Text.UTF8Encoding
        Dim bytes() As Byte = encoding.GetBytes(json)

        Using os As New MemoryStream
            os.Write(bytes, 0, bytes.Length)
            os.Position = 0

            Using reader As New StreamReader(os)
                Dim converter As New Converter(Of Route)
                Dim output As Route

                output = converter.ReturnJSON(reader)

                'output contains data
            End Using
        End Using
    End Sub

JSON データの読み取り方法の詳細な説明については、このページを参照してください。http://www.json.org/

于 2011-02-10T17:20:39.317 に答える