簡體   English   中英

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

[英]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 APIManaged 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM