在序列化MapRoute
对象时,我得到了JSON
这样的数据:
" {\" RouteName \":\" ROUTE1 \" \" RouteWaypoints \":[{},{} ,{},{},{}]}"
RouteWayPoints
列表未正确序列化。
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; }
}
}
此LatLng
Android.Gms.Maps.Model.LatLng
来自Google Maps API,适用于Xamarin.Android。
序列化命令:
string json = JsonConvert.SerializeObject(mapRoute);
答案 0 :(得分:2)
我相信Android.Gms.Maps.Model.LatLng
实际上是Managed Callable Wrapper的Google APIs for Android's LatLng
代理。可能(我自己无法测试)Json.NET的反射机制无法成功发现这种包装类型的成员。
如果是这样,最简单的解决方法是引入Data Transfer Object,将LatLng
映射到DTO,然后序列化。首先,按如下方式定义您的类型:
// 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; }
}
然后,按如下方式构建您的MapRoute
:
_mapRoute.RouteWaypoints = (_wayPoints == null ? null : _wayPoints.Select(l => (LatLngDTO)l).ToList());
答案 1 :(得分:0)
我修改了@dbc LatLngDTO类并编写了两个静态对象返回方法,如下所示:
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);
}
}
它解决了我的问题。我将我的模型序列化为LatLngDTO对象列表,如下所示:
mapRoute.RouteWaypoints = (_wayPoints == null ? null : _wayPoints.Select(l => LatLngDTO.ToLatLngDTO(l)).ToList());
string json = JsonConvert.SerializeObject(mapRoute);
Json = json;
http.PostHTTPData(urlString, json);