سؤال

أمسكت بمثال هذا السؤال جدا, ، وقمت ببناء كائن خرائط Google المخصص الخاص بي المستخدم لإلغاء تمييز كائن 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

والنتيجة النهائية هي

{"Latitude": "50.124300" ، "loncitude": "-114.497990"}

هل كانت مفيدة؟

المحلول

داخليًا ، يقوم DataContractJsonserializer بتعيين أزواج/قيمة json إلى infoset xml. في الواقع ، تم تصميم DataContractJsonserializer على رأس DataContractSerializer المستند إلى XML ويعالج كل إدخال JSON وإخراج JSON كما لو كان يتعامل مع XML. هناك طبقة تجريد عالية المستوى (كاتب JSON وقارئ JSON ، كما هو مكشوفة عبر JSONREADERWRITERFACTORY) التي تترجم فعليًا XML إلى JSON و JSON إلى XML الداخلي.

انظر الى هذا نظرة عامة ممتازة (رسم الخرائط بين JSON و XML) لمعرفة ما يحدث لـ DataContractJsonserializer داخليًا وكيف يسحب كل هذا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top