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