2011-02-10 7 views
1

J'essaye de désérialiser json retourné par certaines directions API similaire à Google Maps API. Mon JSON est la suivante (j'utilise VB.NET 2008):Deserialize complexe JSON (VB.NET)

jsontext = { "version": 0,3, "status": 0, "route_summary": { "total_distance": 300, "TOTAL_TIME": 14, "point_départ": "43", "end_point": "42" }, "route_geometry": [[51.025421,18.647631], [51.026131,18.6471], [51,027802, 18.645639]], "route_instructions": [["Tête nord-ouest sur 43", 88,0,4, "88 m", "NW", 334,8], ["Continuer sur 42", 212,1,10, " 0,2 km "," NW ", 331,1," C ", 356,3]] }

Jusqu'à présent, je suis venu avec le code suivant:

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

Je ne sais pas comment définir la classe complexe, à savoir Output_CloudMade.

J'essaie quelque chose comme:

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 

mais il ne fonctionne pas. Le problème est avec des propriétés complexes, comme route_summary. Il est rempli de "rien". D'autres propriétés, telles que "status" ou "version" sont correctement renseignées.

Des idées, comment définir une classe pour le JSON ci-dessus? Pouvez-vous partager un code de travail pour la désérialisation de JSON dans VB.NET?

Merci,

Répondre

2

Voici un exemple de classe Converter qui prendra un flux entrant de JSON et convertir un objet que vous spécifiez. Je devrais noter que le code ci-dessous est. Net 4.0. Le sérialiseur JSON dans 4 est beaucoup plus facile à utiliser. Faites-moi savoir si vous ne pouvez pas utiliser 4 et je verrai si je peux trouver une version 3.5. Fondamentalement, vous devez créer une structure de classe pour mapper le JSON à une classe. J'ai créé les classes Route et RouteSummary pour vous. J'ai laissé route_geometry et route_instructions comme objets. Vous devriez créer des définitions de classe pour chacun, mais cela devrait vous aider à démarrer.

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 

Voir cette page pour une description détaillée de la lecture des données JSON. http://www.json.org/