0

我从这个 SO question中获取了一个示例,并构建了我自己的自定义 Google Maps 对象,用于反序列化 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 Poco

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

最后的结果是

{“纬度”:“50.124300”,“经度”:“-114.4979990”}

4

1 回答 1

1

在内部,DataContractJsonSerializer 将 JSON 名称/值对映射到 XML 信息集。实际上,DataContractJsonSerializer 构建在基于 XML 的 DataContractSerializer 之上,并像处理 XML 一样处理每个 JSON 输入和 JSON 输出。有一个更高级别的抽象层(一个 JSON 写入器和一个 JSON 读取器,通过 JsonReaderWriterFactory 公开)实际上将此 XML 转换为 JSON 并将 JSON 转换回内部 XML。

请参阅此出色的概述(JSON 和 XML 之间的映射)以了解 DataContractJsonSerializer 在内部发生了什么以及它如何实现这一切。

于 2011-03-31T14:53:24.870 回答