0

Ich griff ein Beispiel aus this SO question und baute mein eigenes Google Maps-Objekt zum Deserialisieren des JSON-Objekts.Wie funktioniert DataContracts? - Deserialize Json

Jetzt funktioniert der Code wie ein Champion, aber ich brauche nur eine Erklärung warum/wie es funktioniert. Versucht der Serializer, Namen zu finden, oder läuft etwas anderes?

Was genau macht das?

Hier ist die arbeiten Code.

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 

Und hier ist die GeolocationLatLon Poco

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

Wenn ich den Code nennen, es ist wirklich ganz einfach.
note, ist dies ein MVC-Controller, die nichts zu tun hat „wirklich“ mit der Frage, anders als zu zeigen, was ich tue

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

Und das Endergebnis

{ "Breite": "50.124300", "Länge": "- 114.4979990"}

Antwort

1

Intern DataContractJsonSerializer Karten JSON Name/Wert-Paare in einen XML-Infoset. Tatsächlich ist DataContractJsonSerializer auf dem XML-basierten DataContractSerializer aufgebaut und verarbeitet jede JSON-Eingabe und JSON-Ausgabe so, als würde es sich um XML handeln. Es gibt eine Abstraktionsebene auf höherer Ebene (ein JSON-Writer und ein JSON-Reader, wie sie über JsonReaderWriterFactory verfügbar gemacht werden), der diesen XML-Code in JSON und JSON zurück in internes XML übersetzt.

Sehen Sie diese excellent overview (Mapping Between JSON and XML), um zu sehen, was intern mit DataContractJsonSerializer passiert und wie es alles abzieht.