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

时间:2017-07-21 14:17:19

标签: c# json google-maps xamarin json.net

在序列化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);

to see objects in my list ,click this

2 个答案:

答案 0 :(得分:2)

我相信Android.Gms.Maps.Model.LatLng实际上是Managed Callable WrapperGoogle 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);