Estoy tratando de deserializar json devuelto por algunas direcciones de la API similar a la API de Google Maps. Mi JSON es el siguiente (estoy usando VB.NET 2008):

jsontext =
{
«versión»: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»: [[«hacia el noroeste en 43″,88,0,4,»88 m»,»NW»,334.8],[«Continuar 42″,212,1,10,»0.2 km»,»NW»,331.1,»C»,356.3]]
}

Hasta el momento en que se me ocurrió el siguiente código:

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

No estoy seguro de cómo definir la clase complejo, es decir, Output_CloudMade.

Estoy tratando de hacer algo como:

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

pero no funciona. El problema es con las propiedades complejas, como route_summary. Está lleno de «nada». Otras propiedades, como «estado» o «versión» son llenados correctamente.

Las ideas, cómo se define la clase por encima de JSON?

Puede compartir algunas código de trabajo para deserializar JSON en VB.NET?

Gracias,

InformationsquelleAutor Ssstefan | 2011-02-10

1 Comentario

  1. 2

    A continuación se muestra un ejemplo de Convertidor de clase, que tendrá una entrada de corriente de JSON y convertir a un objeto que se especifique. Debo señalar que el código a continuación .Net 4.0. El JSON serializador en 4 es mucho más fácil de usar. Déjeme saber si usted no puede usar 4 y voy a ver si me puede sacar una versión 3.5. Básicamente, usted necesita para crear la estructura de una clase para asignar el JSON a una Clase. He creado la Ruta y RouteSummary clases para usted. Dejé route_geometry y route_instructions como objetos. Usted debe crear definiciones de clase para cada uno, pero esto debe empezar.

    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

    Consulte esta página para obtener una descripción detallada de cómo leer los datos en JSON. http://www.json.org/

Dejar respuesta

Please enter your comment!
Please enter your name here