3

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());

しかし、これも効果がありませんでした。

うまくいけば、誰かが私が間違っていることを指摘できますか?

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 に答える