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

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



内部异常似乎指向这样一个事实,即WellKnownValue为null,但并非如此,因为我检查了发送到服务器的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.DbGeometryNewtonsoft.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/

10-10 19:20