Edu*_*rdo 5 spatial deserialization asp.net-web-api
我正在使用Entity Framework 6.0 Code First构建OData v3 Web API.
一切运作良好,我可以执行CRUD操作回到api服务器.
但是我使用的是空间类型,我的一些实体具有DbGeometry属性.当我尝试从客户端应用程序(仅用于测试的控制台应用程序)更新/发布具有DbGeometry类型的实体时,我得到此DataServiceRequestException:
没有为此对象定义的无参数构造函数.
我花了一段时间,但我认为这种DbGeometry类型是负责任的.我已经在这里查看了这个主题并制作了一个自定义JsonConverter,我应用于该属性:
[Required]
[JsonConverter(typeof(DbGeometryConverter))]
[Column("geometria")]
public DbGeometry Geometria { get; set; }
Run Code Online (Sandbox Code Playgroud)
那没用.除非我删除该DbGeometry属性,否则不会在Web api服务器上反序列化该对象.
我还尝试更改全局json序列化程序行为
var formatters = GlobalConfiguration.Configuration.Formatters;
var jsonFormatter = formatters.JsonFormatter;
jsonFormatter.SerializerSettings.Converters.Add(new DbGeometryConverter());
Run Code Online (Sandbox Code Playgroud)
也是徒劳的.我真的需要这些DbGeometry属性.我还能做些什么来解决这个问题?
小智 0
有点晚了,但对于那些寻求答案的人来说:
我已经设法在控制器级别上使用完全相同的代码来做到这一点。这个想法取自这个SO Question&Answer。
因此,这是包含 DbGeometryConverter 的代码。
DbGeometryConverter.cs:
public class DbGeometryConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType.IsAssignableFrom(typeof(DbGeometry));
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var location = JObject.Load(reader);
var token = location["Geometry"]["WellKnownText"];
string geom = token.ToString();
token = location["Geometry"]["CoordinateSystemId"];
int srid = token != null ? int.Parse(token.ToString()) : 0;
var converted = DbGeometry.FromText(geom, srid);
return converted;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override bool CanWrite => false;
}
Run Code Online (Sandbox Code Playgroud)
CustomJsonAttribute.cs:
public class CustomJsonAttribute : Attribute, IControllerConfiguration
{
public void Initialize(HttpControllerSettings controllerSettings, HttpControllerDescriptor controllerDescriptor)
{
var formatter = controllerSettings.Formatters.JsonFormatter;
formatter.SerializerSettings.Converters.Add(new DbGeometryConverter());
}
}
Run Code Online (Sandbox Code Playgroud)
以及[CustomJson]使用 DbGeometry 的控制器上的属性。
| 归档时间: |
|
| 查看次数: |
339 次 |
| 最近记录: |