Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 数据契约是如何工作的反序列化Json_Asp.net_Json_Deserialization_Datacontractjsonserializer - Fatal编程技术网

Asp.net 数据契约是如何工作的反序列化Json

Asp.net 数据契约是如何工作的反序列化Json,asp.net,json,deserialization,datacontractjsonserializer,Asp.net,Json,Deserialization,Datacontractjsonserializer,我抓取了一个示例,并构建了自己的自定义GoogleMaps对象,用于反序列化json对象 现在,代码工作起来就像一个冠军,但我只需要解释一下它为什么/如何工作。序列化程序是否“尝试”匹配名称,或者是否正在进行其他操作 这到底在做什么? 这是正在工作的代码 Imports System.Net Imports System.Web Imports System.Runtime.Serialization Imports System.Runtime.Serialization.Json Impor

我抓取了一个示例,并构建了自己的自定义GoogleMaps对象,用于反序列化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
当我调用代码时,它非常简单。
注意,这是一个MVC控制器,它与问题“真的”无关,只是显示我在做什么

最终的结果是

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


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

请参阅本文,了解DataContractJsonSerializer在内部发生了什么,以及它是如何实现这一切的

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