Geoposition反序列化错误(Newtonsoft.Json)-2146233088

时间:2015-04-09 19:09:51

标签: c# json windows-phone-8.1 json.net winrt-xaml

我尝试在我的Windows Phone(WinRT)应用中反序列化Geoposition对象,但获取此Exception

  带消息的

-2146233088:"无法找到用于类型Windows.Devices.Geolocation.Geoposition的构造函数。一堂课要么   有一个默认的构造函数,一个带参数的构造函数或一个   用JsonConstructor属性标记的构造函数。路径   ' CivicAddress'"

Geoposition与Newtonsoft Json.NET不兼容吗?如果不是,我可以帮助找到解决方法。

下面的代码片段显示了抛出异常的位置。

public async void Sample()
{    
    Geolocator geo = new Geolocator();
    geo.DesiredAccuracyInMeters = 50;
    var x = await geo.GetGeopositionAsync();
    Geoposition geo = JsonConvert.DeserializeObject<Geoposition>(CurrentContext.LocationAsString);
    await EventMap.TrySetViewAsync(geo.Coordinate.Point, 18D);
}

1 个答案:

答案 0 :(得分:2)

似乎Geoposition只有只读属性,没有公共构造函数将这些属性的值作为构造函数参数。因此,您可以序列化它,但不能在反序列化期间构造它。

您可以做的解决方法是构建您自己的此类版本,专门用于序列化目的,包括您在应用中实际需要的属性。

例如,如果您的问题中只需要序列化Geoposition.Coordinate.Point字段,则可以执行以下操作:

namespace YourAppNameSpaceHere
{
    using Windows.Devices.Geolocation;

    public class SerializableGeoPoint
    {
        public SerializableGeoPoint(Geoposition location) 
            : this(location.Coordinate.Point) {}

        public SerializableGeoPoint(Geopoint point)
        {
            this.AltitudeReferenceSystem = point.AltitudeReferenceSystem;
            this.GeoshapeType = point.GeoshapeType;
            this.Position = point.Position;
            this.SpatialReferenceId = point.SpatialReferenceId;
        }

        [JsonConverter(typeof(StringEnumConverter))]
        public AltitudeReferenceSystem AltitudeReferenceSystem { get; set; }

        [JsonConverter(typeof(StringEnumConverter))]
        public GeoshapeType GeoshapeType { get; set; }

        [JsonProperty]
        public BasicGeoposition Position { get; set; }

        [JsonProperty]
        public uint SpatialReferenceId { get; set; }

        public Geopoint ToWindowsGeopoint()
        {
            return new Geopoint(Position, AltitudeReferenceSystem, SpatialReferenceId);
        }
    }
}

序列化时,您可以这样做:

Geoposition position = ....; // call to get position.
CurrentContext.LocationAsString = JsonConvert
    .SerializeObject(new SerializableGeoPoint(position));

反序列化为:

var locationPoint = JsonConvert
    .DeserializeObject<SerializableGeoPoint>(CurrentContext.LocationAsString)
    .ToWindowsGeopoint();

您可能需要在应用程序启动期间的某处为序列化设置添加此项,您可以在其中为应用程序执行其他一次性初始化。

JsonConvert.DefaultSettings = (() =>
{
    var settings = new JsonSerializerSettings();
    settings.Converters.Add(new StringEnumConverter());
    return settings;
});

它指定了JSON序列化的默认设置,在这种情况下添加知道如何在枚举和字符串之间进行转换的转换器。