2011-02-10 2 views
1

Google Maps API와 비슷한 방향 API에서 반환 된 json을 비 직렬화하려고합니다.Complex JSON (VB.NET) 역 직렬화

jsontext = { "버전": 0.3, "상태": 0, "route_summary" { "total_distance을"(I 2008 VB.NET을 사용하고 있습니다) 다음과 같이 내 JSON은 다음과 같습니다 300 "TOTAL_TIME"14 "start_point": "43", "end_point": "42" } "route_geometry"[51.025421,18.647631], [51.026131,18.6471] [51.027802, [42 "에서 계속, 212,1,10,"18.645639]], "route_instructions": [[ "43 북북서, 88,0,4,"88m ","NW ", 334.8] 0.2km ","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) 

I, 즉 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을 비 직렬화하는 작업 코드를 공유 할 수 있습니까?

감사합니다,

답변

2

다음은 JSON의 입력 스트림을 사용자가 지정한 객체로 변환하는 샘플 변환기 클래스입니다. 나는 아래의 코드가 닷넷 4.0임을주의해야한다. 4의 JSON 시리얼 라이저는 훨씬 사용하기 쉽습니다. 네가 4를 사용할 수 없다면 나에게 알려줘. 내가 3.5 버전을 파낼 수 있는지 알게 될거야. 기본적으로 클래스 구조를 만들어 JSON을 클래스에 매핑해야합니다. 나는 당신을 위해 Route and 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/