C#学习教程:使用Newtonsoft.Json反序列化DbGeometry.一切正常,我可以将信息拉取、更新、插入、删除回服务器。但是我使用的是空间类型,当我尝试更新具有空间类型的实体时,出现以下错误Newtonsoft.Json.dll中出现类型为“Newtonsoft.Json.JsonSerializationException”的异常,但附加信息不是在用户代码中处理:从“System.Data.Entity.Spatial.DbGeometry”上的“WellKnownValue”获取值时出错。内部异常似乎指向WellKnownValue为空的事实,但事实并非如此,因为我检查了发送到服务器的JSON,然后将其发送到BreezeContextProvider并使用SaveChanges方法保存。{“entities”:[{“TableKey”:2,“CaseName”:“MikhailLermontov”,“StartDate”:“2013-06-11T00:00:00Z”,“EndDate”:null,“IsCurrent”:true,“SRID”:109,“形状”:{“$id”:“2”,“$type”:“System.Data.Entity.Spatial.DbGeometry,EntityFramework”,“几何”:{“$id”:“3“,“$type”:“system.data.entity.spatial.dbgeometrywellnownyvalue,entityframework”,“coordinatesystemstemid”:2193,“众所周知的Text”:))"}},"SpillLocation":"马尔堡峡湾","图片":"http://sofzh.miximages.com/c%23/lm5.jpgrn","DefaultBaseMapKey":2,"__unmapped":{"isPartial":false},"entityAspect":{"entityTypeName":"DatSpillCase:#Osiris.Model","defaultResourceName":"DatSpillCases","entityState":"Modified","originalValuesMap":{"CaseName":"MikhailLermontov"},"autoGeneratedKey":{"propertyName":"TableKey","autoGeneratedKeyType":"Identity"}}}],"saveOptions":{}}所所以我的问题是,是否可以在NewtonSoft库中反序列化DbGeometry类型,如果不能,是否有任何建议如何解决这个问题System.Data.Spatial.DbGeometry不适用于Newtonsoft.Json您需要创建一个JsonConverter来转换DbGeometry);}publicoverrideobjectReadJson(JsonReaderreader,TypeobjectType,objectexistingValue,JsonSerializerserializer){JObjectlocation=JObject.Load(reader);JTokentoken=location["Geometry"]["WellKnownText"];字符串值=令牌。字符串();DbGeometryconverted=DbGeometry.PolygonFromText(value,2193);返回转换;}publicoverridevoidWriteJson(JsonWriterwriter,objectvalue,JsonSerializerserializer){//基础序列化很好得到;希望能帮到你。上面的答案有效,但针对SRID(CoordinateSystemId)2193进行了硬编码。但是,坐标系ID可以出现在问题中所示的序列化数据中,也可以出现在WellKnownText“SRID=2193;POINT(0)0”中)”。此方法也将只读取多边形,但WellKnownText可以是很多东西,如几何集合、点、线串等。为了检索,可以更新ReadJson方法以使用更通用的FromText方法,如下所示。上面是一个更新的类,具有更通用的坐标系,它也适用于任何几何类型。我还添加了地理版本以供参考。公共类DbGeometryConverter:JsonConverter{publicoverrideboolCanConvert(TypeobjectType){returnobjectType.IsAssignableFrom(typeof(string));}publicoverrideobjectReadJson(JsonReaderreader,TypeobjectType,objectexistingValue,JsonSerializerserializer){JObjectlocation=JObject.Load(reader);JTokentoken=location["Geometry"]["WellKnownText"];字符串值=token.ToString();JTokensridToken=location["Geometry"]["CoordinateSystemId"];诠释斯里德;if(sridToken==null||int.TryParse(sridToken.ToString(),outsrid)==false||value.Contains("SRID")){//在这里设置默认坐标系。斯里德=0;}DbGeometry转换;如果(srid>0)converted=DbGeometry.FromText(value,srid);否则转换=DbGeometry.FromText(值);返回转换;}publicoverridevoidWriteJson(JsonWriterwriter,objectvalue,JsonSerializerserializer){//基本序列化很好serializer.Serialize(writer,value);}}公开课DbGeographyConverter:JsonConverter{publicoverrideboolCanConvert(TypeobjectType){returnobjectType.IsAssignableFrom(typeof(string));}publicoverrideobjectReadJson(JsonReaderreader,TypeobjectType,objectexistingValue,JsonSerializerserializer){JObjectlocation=JObject.Load(reader);JTokentoken=location["Geometry"]["WellKnownText"];字符串值=token.ToString();JTokensridToken=location["Geometry"]["CoordinateSystemId"];诠释斯里德;if(sridToken==null||int.TryParse(sridToken.ToString(),outsrid)==false||value.Contains("SRID")){//在这里设置默认坐标系。//注意:地理应该始终有一个SRID,它必须与数据库中的数据匹配,否则所有比较都将返回NULL!斯里德=0;}DbGeography转换;如果(srid>0)converted=DbGeography.FromText(value,srid);否则转换=DbGeography.FromText(值);返回转换;}publicoverridevoidWriteJson(JsonWriterwriter,objectvalue,JsonSerializerserializer){//基础序列化很好serializer.Serialize(writer,value);}}不明白为什么不上线(DbGeometryWellKnownValue):"$type":"System.Data.Entity.Spatial.DbGeometryWellKnownValue,EntityFramework",应该是(DbGeometry.WellKnownValue)吧?以上就是C#学习教程:使用Newtonsoft.Json反序列化DbGeometry共享的所有内容。如果对你有用,需要进一步了解C#学习教程,希望你多加关注—"$type":"System.Data.Entity.Spatial.DbGeometry.WellKnownValue,EntityFramework",本文收藏来自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
