Pregunta

Me agarró un ejemplo fuera de esta pregunta SO , y construido mi propia personalizada de Google Maps objeto utilizado para deserializar el objeto JSON.

Ahora el código funciona como un campeón, pero sólo necesito una explicación sobre por qué / cómo funciona. ¿El serializador "tratar" de hacer coincidir los nombres, o es algo más en juego.

¿Qué es exactamente esta haciendo?

Aquí está la trabajar código.

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

Y aquí está la GeolocationLatLon Poco

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

Cuando llamo el código, es realmente muy simple.
nota, este es un controlador MVC, que no tiene nada que ver "realmente" con la pregunta que no sea para mostrar lo que estoy haciendo

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

Y el resultado final es

  

{ "latitud": "50.124300", "longitud": "- 114.4979990"}

¿Fue útil?

Solución

A nivel interno, DataContractJsonSerializer mapas de pares de nombre / valor JSON a un conjunto de información XML. De hecho, DataContractJsonSerializer se construye en la parte superior de la DataContractSerializer basado en XML y procesa cada entrada y salida de JSON JSON como si se tratara de XML. Hay una capa de abstracción de alto nivel (un escritor y un lector de JSON JSON, como se expone a través de JsonReaderWriterFactory) que en realidad se traduce este XML a volver JSON y JSON a XML interno.

excelente visión (Correlación entre JSON y XML) a ver lo que ocurre con DataContractJsonSerializer internamente y cómo se tira de todo esto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top