2

У меня есть простая модель объекта ADO.NET, которую я просматриваю с помощью OData. Одним из полей в модели сущности является тип географии (география в SQL Server). Я могу запросить данные просто отлично, и я получаю следующий сериализованный формат колонок географии:Изменение сериализации географии в JSON.NET + WebApi2/OData

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

и добавить его в настройках Serializer JSON в моей конфигурации OData:

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

, но это также не было никакого эффекта.

Надеюсь, кто-то может указать, что я делаю неправильно?

ответ

1

Хотя Web API iteself использует сериалайзер Json.NET, немного покопаться в source code, кажется, указывает, что MediaTypeFormatter for Web API OData использует свой собственный внутренний сериалайзер, который не Json.Net. Поэтому добавление конвертера Json.Net в конфигурацию не повлияет на OData. К сожалению, без глубокого анализа кода я не знаю, расширяется ли сериализатор OData таким же образом и/или можно ли использовать его вместо Json.Net.

+0

Благодарим за это. Я быстро проскочил, но я не вижу места, где я могу изменить его сериализацию. Я попробую спросить на сайте OData, так как это, кажется, проблема. Еще раз спасибо. – Barguast

0

Мне также потребовались некоторые астетики, так как я не хотел читать объект 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); 
     } 
    } 
} 
+0

Спасибо. Я не думаю, что это работает с OData, хотя у него есть собственный сериализатор, и я не думаю, что он довольно гибкий, когда дело доходит до пользовательской сериализации. – Barguast