我有一个简单的 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());
但这也没有效果。
希望有人能指出我做错了什么?
,但在源代码中进行一些挖掘似乎表明 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 );
}
}
}