2010-11-26 23 views
0

J'ai saisi un exemple de this SO question, et construit mon propre objet Google Maps personnalisé utilisé pour désérialiser l'objet json.Comment fonctionne DataContracts? - Deserialize Json

Maintenant, le code fonctionne comme un champion, mais j'ai juste besoin d'une explication sur pourquoi/comment cela fonctionne. Est-ce que le sérialiseur "essaie" de faire correspondre les noms, ou est-ce qu'il se passe autre chose?

Qu'est-ce que c'est exactement cela?

Voici le code de travail.

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 

Et voici le GeolocationLatLon Poco

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

Quand j'appelle le code, il est vraiment très simple.
note, c'est un contrôleur MVC, qui n'a rien à faire « vraiment » la question autre que de montrer ce que je fais

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

Et le résultat final est

{ "latitude": "50.124300", "de longitude": "- 114.4979990"}

Répondre

1

En interne, des paires de cartes DataContractJsonSerializer nom JSON/XML valeur à un ensemble d'information. En fait, DataContractJsonSerializer est construit sur le DataContractSerializer basé sur XML et traite chaque entrée JSON et chaque sortie JSON comme s'il s'agissait de XML. Il existe une couche d'abstraction de niveau supérieur (un graveur JSON et un lecteur JSON, tel qu'exposé via JsonReaderWriterFactory) qui traduit en fait ce XML en JSON et JSON en XML interne.

Voir ce excellent overview (Mapping Between JSON and XML) pour voir ce qui arrive à DataContractJsonSerializer en interne et comment il tire tout cela.