Json.NET返回序列化Android.Gms.Maps.Model.LatLng对象列表的空对象

在序列化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 RouteWaypoints { get; set; } } } 

这里的LatLng是来自Google Maps API for Xamarin.Android的Android.Gms.Maps.Model.LatLng

序列化命令:

 string json = JsonConvert.SerializeObject(mapRoute); 

要查看列表中的对象,请单击此按钮

我相信Android.Gms.Maps.Model.LatLng实际上是Android的LatLng Google API的托管可调用包装代理。 可能(我自己无法测试)Json.NET的reflection机制无法成功发现这种包装类型的成员。

如果是这样,最简单的解决方法是引入数据传输对象 ,将LatLng映射到DTO,并将其序列化。 首先,定义您的类型如下:

 // Required for For System.Linq.Enumerable.Select // 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 RouteWaypoints { get; set; } } 

然后,按如下方式构建MapRoute

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

我修改了@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);