2010-11-26 26 views
0

我抓取了一個關於this SO question的示例,並構建了自己的用於反序列化json對象的自定義Google Maps對象。DataContracts如何工作? - Deserialize Json

現在的代碼就像一個冠軍,但我只需要解釋爲什麼/如何工作。串行器是否「嘗試」匹配名稱,或者是其他事情正在進行。

這是幹什麼的?

這裏的工作代碼。

Imports System.Net 
Imports System.Web 
Imports System.Runtime.Serialization 
Imports System.Runtime.Serialization.Json 
Imports System.Web.Script.Serialization 

Namespace Utilities.Apis 
    Public NotInheritable Class GoogleGeolocate 


     Private Const googleUrl As String = "http://maps.googleapis.com/maps/api/geocode/json?address={0}&sensor=false" 
     Private Sub New() 
     End Sub 

     Public Shared Function GetLatLon(ByVal address As String) As String 
      ''# This is just here to prevent "placeholder" data from being submitted. 
      If address = "6789 university drive" Then 
       Return Nothing 
      End If 

      address = HttpUtility.UrlEncode(address) 

      Dim url = String.Format(googleUrl, address) 

      Dim request = DirectCast(HttpWebRequest.Create(url), HttpWebRequest) 
      request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate") 
      request.AutomaticDecompression = DecompressionMethods.GZip Or DecompressionMethods.Deflate 
      Dim serializer As New DataContractJsonSerializer(GetType(GoogleResponse)) 
      Dim res = DirectCast(serializer.ReadObject(request.GetResponse().GetResponseStream()), GoogleResponse) 

      Dim resources As GoogleResponse.Result = res.results(0) 
      Dim point = resources.geometry.location.lat 
      Dim latlon As New GeolocationLatLon 
      With latlon 
       .latitude = resources.geometry.location.lat 
       .longitude = resources.geometry.location.lng 
      End With 

      Dim jsonSerializer = New JavaScriptSerializer 

      Return jsonSerializer.Serialize(latlon) 
     End Function 
    End Class 

    <DataContract()> 
    Public Class GoogleResponse 
     <DataMember()> 
     Public Property results() As Result() 
     <DataContract()> 
     Public Class Result 
      <DataMember()> 
      Public Property geometry As m_Geometry 
      <DataContract()> 
      Public Class m_Geometry 
       <DataMember()> 
       Public Property location As m_location 
       <DataContract()> 
       Public Class m_location 
        <DataMember()> 
        Public Property lat As String 
        <DataMember()> 
        Public Property lng As String 
       End Class 
      End Class 
     End Class 

    End Class 
End Namespace 

而這裏的GeolocationLatLon波蘇

Public Class GeolocationLatLon 
    Public latitude As String 
    Public longitude As String 
End Class 

當我調用的代碼,它真的很簡單。
注意,這是一個MVC控制器,這無關「真」比其他的問題,以顯示我在做什麼

Function GeoLocation(ByVal address As String) As ContentResult 
     Return New ContentResult With {.Content = GoogleGeolocate.GetLatLon(address), 
             .ContentType = "application/json"} 
    End Function 

而最終的結果是

{「latitude」:「50.124300」,「longitude」:「 - 114.4979990」}

回答

1

在內部,DataContractJsonSerializer將JSON名稱/值對映射到XML信息集。實際上,DataContractJsonSerializer構建在基於XML的DataContractSerializer之上,並處理每個JSON輸入和JSON輸出,就像處理XML一樣。有一個更高層次的抽象層(JSON writer和JSON reader,通過JsonReaderWriterFactory公開)實際上將這個XML轉換爲JSON和JSON回到內部XML。

看到這個excellent overview (Mapping Between JSON and XML)看看DataContractJsonSerializer內部會發生什麼,以及它如何將所有這一切。