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