gpt4 book ai didi

c# - 使用 Newtonsoft.Json 反序列化 DbGeometry

转载 作者:可可西里 更新时间:2023-11-01 08:21:55 30 4
gpt4 key购买 nike

我正在按照 John Papa 在其最新的 PluralSight 类(class)中概述的方法使用 Angular、Breeze 和 Web API 2 构建 SPA。

一切正常,我可以将信息提取、更新、插入、删除回服务器。但是,我使用的是空间类型,当我尝试使用空间类型更新实体时,出现以下错误

An exception of type 'Newtonsoft.Json.JsonSerializationException' occurred in Newtonsoft.Json.dll but was not handled in user code

Additional information: Error getting value from 'WellKnownValue' on 'System.Data.Entity.Spatial.DbGeometry'.

内部异常似乎指向 WellKnownValue 为空的事实,但事实并非如此,因为我已经检查了发送到服务器的 JSON,然后发送到 Breeze ContextProvider 并使用 SaveChanges 方法保存。

{
"entities": [
{
"TableKey": 2,
"CaseName": "Mikhail Lermontov",
"StartDate": "2013-06-11T00:00:00Z",
"EndDate": null,
"IsCurrent": true,
"SRID": 109,
"Shape": {
"$id": "2",
"$type": "System.Data.Entity.Spatial.DbGeometry, EntityFramework",
"Geometry": {
"$id": "3",
"$type": "System.Data.Entity.Spatial.DbGeometryWellKnownValue, EntityFramework",
"CoordinateSystemId": 2193,
"WellKnownText": "POLYGON ((1695943 5462665, 1713098 5462665, 1713098 5449659, 1695943 5449659, 1695943 5462665))"
}
},
"SpillLocation": "Marlborough Sounds",
"Image": "http://www.nzmaritime.co.nz/images/lm5.jpg\r\n",
"DefaultBaseMapKey": 2,
"__unmapped": {
"isPartial": false
},
"entityAspect": {
"entityTypeName": "DatSpillCase:#Osiris.Model",
"defaultResourceName": "DatSpillCases",
"entityState": "Modified",
"originalValuesMap": {
"CaseName": "Mikhail Lermontov"
},
"autoGeneratedKey": {
"propertyName": "TableKey",
"autoGeneratedKeyType": "Identity"
}
}
}
],
"saveOptions": {}
}

所以我的问题是,是否可以在 NewtonSoft 库中反序列化 DbGeometry 类型,如果不能,有什么建议可以解决这个问题。

最佳答案

System.Data.Spatial.DbGeometry 不能很好地与 Newtonsoft.Json 搭配使用

您需要创建一个JsonConverter 来转换DbGeometry

public class DbGeometryConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType.IsAssignableFrom(typeof(string));
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JObject location = JObject.Load(reader);
JToken token = location["Geometry"]["WellKnownText"];
string value = token.ToString();

DbGeometry converted = DbGeometry.PolygonFromText(value, 2193);
return converted;
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
// Base serialization is fine
serializer.Serialize(writer, value);
}
}

然后在模型中的属性上添加属性

[JsonConverter(typeof(DbGeometryConverter))]
public DbGeometry Shape { get; set; }

现在,当您点击 BreezeController 时,反序列化将由我们的新 DbGeometryConverter 处理。

希望对您有所帮助。

关于c# - 使用 Newtonsoft.Json 反序列化 DbGeometry,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20926102/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com