0

このSOの質問から例を取得し、jsonオブジェクトの逆シリアル化に使用する独自のカスタムGoogleマップオブジェクトを作成しました。

これでコードはチャンピオンのように機能しますが、なぜ/どのように機能するのかについての説明が必要です。シリアライザーは名前を一致させるために「試行」しますか、それとも何か他のことが起こっていますか。

これは正確に何をしているのですか?

これが動作するコードです。

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

そしてこれがGeolocationLatLonPocoです

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の上に構築されており、すべてのJSON入力とJSON出力をXMLを処理しているかのように処理します。このXMLをJSONに変換し、JSONを内部XMLに戻す、より高レベルの抽象化レイヤー(JSONライターとJSONリーダー、JsonReaderWriterFactoryを介して公開)があります。

この優れた概要(JSONとXML間のマッピング)を参照して、DataContractJsonSerializerが内部でどのように実行され、これがどのように実行されるかを確認してください。

于 2011-03-31T14:53:24.870 に答える