OData を使用して公開している単純な ADO.NET エンティティ モデルがあります。エンティティ モデルのフィールドの 1 つは地理タイプ (SQL Server の地理) です。データを問題なくクエリでき、geography 列に対して次のシリアル化された形式を取得できます。
"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());
しかし、これも効果がありませんでした。
うまくいけば、誰かが私が間違っていることを指摘できますか?