[英]Json.NET returns empty objects serializing list of Android.Gms.Maps.Model.LatLng objects
在序列化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
是來自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的Managed Callable Wrapper代理。 可能(我自己無法測試)Json.NET的反射機制無法成功發現這種包裝類型的成員。
如果是這樣,最簡單的解決方法是引入一個數據傳輸對象 ,將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());
我修改了@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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.