c# json google-maps xamarin json.net

c# - Json.NET devuelve objetos vacíos serializando la lista de objetos Android.Gms.Maps.Model.LatLng



google-maps xamarin (2)

Mientras serializo el objeto MapRoute , obtuve datos JSON como este:

"{/" RouteName / ": /" route1 / ", /" RouteWaypoints / ": [{}, {}, {}, {}, {}]}"

RouteWayPoints lista de RouteWayPoints no se serializa correctamente.

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; } } }

Aquí LatLng es Android.Gms.Maps.Model.LatLng de la API de Google Maps para Xamarin.Android.

Comando serializado:

string json = JsonConvert.SerializeObject(mapRoute);


Creo que Android.Gms.Maps.Model.LatLng es en realidad un proxy administrado de Wrapper invocable para API de Google para LatLng de Android . Posiblemente (no puedo probarlo yo mismo) El mecanismo de reflexión de Json.NET no puede descubrir con éxito los miembros de dicho tipo de envoltura.

Si es así, la solución más fácil sería introducir un objeto de transferencia de datos , asignar el LatLng al DTO y serializarlo. Primero, defina sus tipos de la siguiente manera:

// 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; } }

Luego, construye tu MapRoute siguiente manera:

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


Modifiqué @dbc LatLngDTO class y escribí dos métodos estáticos de devolución de objetos como a continuación:

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); } }

resolvió mi problema Y serialicé mi modelo con una lista de objetos LatLngDTO como a continuación:

mapRoute.RouteWaypoints = (_wayPoints == null ? null : _wayPoints.Select(l => LatLngDTO.ToLatLngDTO(l)).ToList()); string json = JsonConvert.SerializeObject(mapRoute); Json = json; http.PostHTTPData(urlString, json);