更改 JSON.NET + WebApi2/OData 中地理的序列化



我有一个简单的 ADO.NET 实体模型,我正在使用OData公开它。实体模型中的字段之一是"地理"类型(SQL Server 中的"地理")。我可以很好地查询数据,并且我得到了地理列的以下序列化格式:

"Shape":{
    "WellKnownValue":{
      "CoordinateSystemId":4326,
      "WellKnownText":"POLYGON ((...)",
      "WellKnownBinary":null
    }

所以这有效,但我希望我可以更改此对象的序列化以使其更像:

"Shape":"4326:POLYGON((...))"

诚然,这主要是为了美观,但最好有一个更简单的图表和更短的信息。

我写了以下我认为会有所帮助的课程:

public class JsonGeographyConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType.Equals(typeof(DbGeography));
    }
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var geog = (DbGeography)value;
        if (geog != null)
            writer.WriteValue(string.Format("{0}:{1}", geog.WellKnownValue.CoordinateSystemId, geog.WellKnownValue.WellKnownText));
        else
            writer.WriteNull();
    }
}

并将其添加到我的 OData 配置中的 JSON 序列化程序设置中:

var config = new HttpConfiguration();
config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new JsonGeographyConverter());

但这似乎没有区别。事实上,CanConvert 中放置的断点永远不会到达,所以我倾向于认为我没有正确设置 JSON。

我也试过:

var config = GlobalConfiguration.Configuration;
config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new JsonGeographyConverter());

但这也没有效果。

希望有人能指出我做错了什么?

尽管 Web API iteself 使用 Json.Net 序列化程序

,但在源代码中进行一些挖掘似乎表明 MediaTypeFormatter for Web API OData 使用自己的内部序列化程序,序列化程序不是 Json.Net。 因此,将 Json.Net 转换器添加到配置不会对 OData 产生任何影响。 不幸的是,如果没有对代码进行深入分析,我不知道 OData 的序列化程序是否以相同的方式扩展,和/或是否可以让它改用 Json.Net。

我也需要一些美学,因为我不想读入 json 对象,而我只需要客户端的 latlng,所以我也做了同样的事情。

我的代码如下。已经工作了一段时间了,没有任何问题。

  public class DbGeographyConverter : JsonConverter
{
    public override bool CanConvert ( Type objectType )
    {
        return objectType.IsAssignableFrom( typeof( DbGeography ) );
    }
    public override object ReadJson ( JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer )
    {
        if ( reader.Value == null ) {
            return null;
        }
        return Parser.ToDbGeography( reader.Value.ToString() );
    }
    public override bool CanWrite { get { return true; } }
    public override void WriteJson ( JsonWriter writer, object value, JsonSerializer serializer )
    {
        //Attempting to serialize null dosent go well
        if ( value != null ) {
            var location = value as DbGeography;
            serializer.Serialize( writer, location.Latitude + "," + location.Longitude );
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新