2017-07-21 2 views
1

Serialisierung Während MapRoute Objekt Serialisierung Ich habe JSON Daten wie folgt aus:Json.NET gibt leere Objekte Liste der Android.Gms.Maps.Model.LatLng Objekte

"{\" Route \ ": \" route1 \ "\ "RouteWaypoints \": [{} {} {} {} {}]}"

RouteWayPoints Liste nicht ordnungsgemäß serialisiert.

using Android.Gms.Maps.Model; 
using Newtonsoft.Json; 
using System.Collections.Generic; 

namespace App3.Model 
{ 
    public class Id 
    { 
    [JsonProperty(PropertyName = "$oid")] 
    public string id { get; set; } 
    } 

    public class MapRoute 
    { 
    public Id _id { get; set; } 
    public string RouteName { get; set; } 
    public List<LatLng> RouteWaypoints { get; set; } 
    } 
} 

Hier LatLng ist Android.Gms.Maps.Model.LatLng vom Google Maps API für Xamarin.Android.

Serialize Befehl:

string json = JsonConvert.SerializeObject(mapRoute); 

to see objects in my list ,click this

+1

Sie sagen, es ist nicht richtig serialisiert - warum? Wird eine Ausnahme ausgelöst oder nicht aufgefüllt? Möglicherweise liegt es daran, dass das Basis-Java.Lang.Object falsch serialisiert wurde - es könnte sich lohnen, eine Modellklasse zu implementieren und diese zu serialisieren. – jProg2015

+4

@Hesen können Sie Ihre LatLng-Klassendefinition teilen? –

+1

Das ist nicht der Serialisierungsbefehl, den Sie verwenden, entsprechend Ihrem Screenshot. Sie übergeben auch einige JsonSerializerSettings. Was sind diese Einstellungen? Kannst du auch den Code zeigen, wo du die Wegpunkte aufstellst, damit wir sehen können, was in ihnen ist? –

Antwort

0

i LatLngDTO Klasse modifiziert @dbc und zwei statische Methoden Objekt returner schreiben wie unten:


using Android.Gms.Maps.Model; 

    namespace App3.Model 
    { 
     public class LatLngDTO 
     { 
      public double Latitude { get; set; } 
      public double Longitude { get; set; } 

      public LatLngDTO(double lat,double lng) 
      { 
      Latitude = lat; 
      Longitude = lng; 
      } 

      public static LatLng ToLatLng(LatLngDTO latLng) 
      { 
      if (latLng == null) 
       return null; 
      else 
       return new LatLng(latLng.Latitude, latLng.Longitude); 
      } 

      public static LatLngDTO ToLatLngDTO(LatLng latLng) 
      { 
       if (latLng == null) 
       return null; 
       else 
       return new LatLngDTO(latLng.Latitude, latLng.Longitude); 
      } 
     } 

es löste mein Problem. Und ich serialisierte mein Modell mit einer Liste von LatLngDTO-Objekten wie unten:

mapRoute.RouteWaypoints = (_wayPoints == null ? null : _wayPoints.Select(l => LatLngDTO.ToLatLngDTO(l)).ToList()); 

      string json = JsonConvert.SerializeObject(mapRoute); 
      Json = json; 
      http.PostHTTPData(urlString, json); 
2

Ich glaube Android.Gms.Maps.Model.LatLng ist eigentlich ein Managed Callable Wrapper Proxy für Google APIs for Android's LatLng. Möglicherweise (ich kann es nicht selbst testen) Der Reflektionsmechanismus von Json.NET kann die Member eines solchen Wrappertyps nicht erfolgreich erkennen.

Wenn ja, wäre die einfachste Problemumgehung, eine Data Transfer Object einzuführen, die LatLng dem DTO zuzuordnen und das zu serialisieren. Zuerst definieren Ihre Typen, wie folgt:

// Required for For System.Linq.Enumerable.Select<TSource,TResult> 
// https://developer.xamarin.com/api/member/System.Linq.Enumerable.Select%7BTSource,TResult%7D/p/System.Collections.Generic.IEnumerable%7BTSource%7D/System.Func%7BTSource,TResult%7D/ 
using System.Linq; 

public class LatLngDTO 
{ 
    public double Latitude { get; set; } 
    public double Longitude { get; set; } 

    public static implicit operator LatLng(LatLngDTO latLng) 
    { 
     if (latLng == null) 
      return null; 
     return new LatLng(latLng.Latitude, latLng.Longitude); 
    } 

    public static implicit operator LatLngDTO(LatLng latLng) 
    { 
     if (latLng == null) 
      return null; 
     return new LatLngDTO { Latitude = latLng.Latitude, Longitude = latLng.Longitude }; 
    } 
} 

public class Id 
{ 
    [JsonProperty(PropertyName = "$oid")] 
    public string id { get; set; } 
} 

public class MapRoute 
{ 
    public Id _id { get; set; } 
    public string RouteName { get; set; } 
    public List<LatLngDTO> RouteWaypoints { get; set; } 
} 

Dann konstruieren Ihre MapRoute wie folgt:

_mapRoute.RouteWaypoints = (_wayPoints == null ? null : _wayPoints.Select(l => (LatLngDTO)l).ToList()); 
+0

https://i.gyazo.com/0fa363bec7a330ef3d4043ac2ebeadad.gif –

+0

Ich habe versucht, Ihre Variante der Lösung zuerst warf es mich aus dem Debug-Modus ohne Ausnahme, dann machte ich einige Änderungen ich erinnere mich nicht wirklich jetzt Schleifen in 'öffentlichen statischen impliziten Operator LatLngDTO (LatLng latLng) { if (latLng == null) Rückgabewert null; return new LatLng (latLng.Latitude, latLng.Longitude); } ' Methode. Ich staple dort [link] (https://i.gyazo.com/0fa363bec7a330ef3d4043ac2ebeadad.gif) –

+0

@HesenTagiyev - Entschuldigung, antwortete ich ohne Unit-Test den Code. Fest. – dbc

Verwandte Themen