Question

Je saisi un exemple hors de cette question SO , et construit mon propre objet Google Maps personnalisé utilisé pour désérialiser l'objet JSON.

Maintenant, le code fonctionne comme un champion, mais je dois juste une explication sur pourquoi / comment cela fonctionne. Le sérialiseur « essayer » de faire correspondre les noms, ou quelque chose d'autre se passe.

Qu'est-ce exactement ce faire?

Voici le code 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.
Remarque, 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"}

Était-ce utile?

La solution

En interne, DataContractJsonSerializer cartes paires nom / valeur JSON à un XML Infoset. En fait, DataContractJsonSerializer est construit au-dessus du DataContractSerializer XML et traite toutes les entrées et JSON JSON comme si elle avait affaire à XML. Il y a une couche d'abstraction de niveau supérieur (un écrivain JSON et un lecteur de JSON, comme exposé par JsonReaderWriterFactory) qui se traduit en fait ce XML et JSON JSON retour au format XML interne.

Voir cette excellente vue d'ensemble (cartographie entre JSON et XML) voir ce qui se passe à l'intérieur DataContractJsonSerializer et comment il tire tout ceci.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top