1

我正在尝试反序列化某些类似于 Google Maps API 的方向 API 返回的 json。我的 JSON 如下(我使用的是 VB.NET 2008):

jsontext = {“版本”:0.3,“状态”:0,“路线摘要”:{“总距离”:300,“总时间”:14,“起点”:“43”,“终点”:“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 公里","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

下面是一个示例 Converter 类,它将接收 JSON 的传入流并转换为您指定的对象。我应该注意下面的代码是.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 回答