3

我有一个简单的 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());

但这也没有效果。

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

4

2 回答 2

1

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

于 2014-02-14T17:22:49.450 回答
0

我还需要一些美学,因为当我只需要客户端的 latlng 时我不想读入 json 对象,所以我也这样做了。

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

  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 );
        }
    }
}
于 2015-08-11T04:26:02.613 回答