c#Json.net DbGeography反序列化错误

Ale*_*Doe 5 c# entity-framework json.net

我试图从数据库中获取Spartial数据,然后将其序列化(工作得很好).当我尝试反序列化该数据时,抛出JsonSerializationException.

DbGeography geoPoint = CreatePoint(40.7056308, -73.9780035);
string serializedPoint = JsonConvert.SerializeObject(geoPoint);
DbGeography resjson = JsonConvert.DeserializeObject<DbGeography>(serializedPoint);
Run Code Online (Sandbox Code Playgroud)

这是CreatePoint方法:

public static DbGeography CreatePoint(double latitude, double longitude)
{
string text = string.Format(CultureInfo.InvariantCulture.NumberFormat,
"POINT({0} {1})", longitude, latitude);
return DbGeography.PointFromText(text, 4326);
}
Run Code Online (Sandbox Code Playgroud)

我在控制台应用程序中生成了此错误.

Nuget Packages installed: 
EntityFramework 6.1.0
Newtonsoft.Json 6.0.3
Run Code Online (Sandbox Code Playgroud)

有谁知道我做错了什么?

TC.*_*TC. 12

System.Data.Spatial.DbGeography(我假设您正在使用)不适合Newtonsoft.Json的反序列化.你没有提到抛出的异常,但我观察到的是:

无法找到用于System.Data.Spatial.DbGeography类型的构造函数.一个类应该有一个默认的构造函数,一个带参数的构造函数或一个用JsonConstructor属性标记的构造函数.

您可以通过自己提供序列化/反序列化逻辑来解决此问题JsonConverter.我使用了JSON.Net JsonConverter中的一个用于DbGeography并略微修改它以修复我的本地文化的错误(使用','作为小数分隔符):

public class DbGeographyConverter : JsonConverter
{
    private const string LATITUDE_KEY = "latitude";
    private const string LONGITUDE_KEY = "longitude";

    public override bool CanConvert(Type objectType)
    {
        return objectType.Equals(typeof(DbGeography));
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Null)
            return default(DbGeography);

        var jObject = JObject.Load(reader);

        if (!jObject.HasValues || (jObject.Property(LATITUDE_KEY) == null || jObject.Property(LONGITUDE_KEY) == null))
            return default(DbGeography);

        string wkt = string.Format(CultureInfo.InvariantCulture, "POINT({1} {0})", jObject[LATITUDE_KEY], jObject[LONGITUDE_KEY]);
        return DbGeography.FromText(wkt, DbGeography.DefaultCoordinateSystemId);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var dbGeography = value as DbGeography;

        serializer.Serialize(writer, dbGeography == null || dbGeography.IsEmpty ? null : new { latitude = dbGeography.Latitude.Value, longitude = dbGeography.Longitude.Value });
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样使用它:

DbGeography geoPoint = CreatePoint(40.7056308, -73.9780035);
string serializedPoint = JsonConvert.SerializeObject(geoPoint, new DbGeographyConverter());
DbGeography resjson = JsonConvert.DeserializeObject<DbGeography>(serializedPoint, new DbGeographyConverter());
Run Code Online (Sandbox Code Playgroud)