c# - Json.NET بإرجاع الكائنات فارغة تسلسل قائمة الكائنات Android.Gms.Maps.Model.LatLng




google-maps xamarin (2)

أثناء تسلسل كائن MapRoute حصلت على بيانات JSON مثل هذا:

"{\" روتنام \ ": \" road1 \ "، \" رونتوايبوانتس \ ": [{}، {}، {}، {}، {}]}"

لا يتم تسلسل قائمة 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 من أبي خرائط جوجل ل Xamarin.Android.

تسلسل الأمر:

string json = JsonConvert.SerializeObject(mapRoute);


أعتقد أن Android.Gms.Maps.Model.LatLng هو في الواقع وكيل وكيل قابل للاستدعاء المدارة لواجهات برمجة تطبيقات غوغل ل LatLng الروبوت . ربما (لا أستطيع اختبار نفسي) آلية التفكير Json.NET غير قادر على اكتشاف بنجاح أعضاء مثل هذا النوع المجمع.

إذا كان الأمر كذلك، فإن الحل الأسهل هو إدخال كائن نقل البيانات ، تعيين LatLng إلى دتو، وتسلسل ذلك. أولا، حدد أنواعك كما يلي:

// 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 فئة لاتلنغدو والكتابة اثنين من أساليب ريتورنر كائن ثابت مثل أدناه:


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

حلت مشكلتي. وأنا مسلسل نموذجي مع قائمة كائنات لاتلنغدو مثل أدناه:

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

            string json = JsonConvert.SerializeObject(mapRoute);
            Json = json;
            http.PostHTTPData(urlString, json);






json.net