35

更新 发现问题——从错误的类继承,需要是 JsonConverter。

我有一个具有 System.Data.Entity.Spatial.DbGeography 类型的 Location 属性的类。默认的 Json.NET 序列化器输出 JSON 文本,如下所示:

  ...
  "PlaceType": 0,
  "Location": {
    "Geography": {
      "CoordinateSystemId": 4326,
      "WellKnownText": "POINT (-88.00000 44.00000)"
    }
  },
  "AddedDT": null,
  ...

我希望它发出这样的文字:

  ...
  "PlaceType": 0,
  "Location": [-88.00000,44.00000],
  "AddedDT": null,
  ...

...所以在我看来,我应该做的是覆盖当前在 DbGeography 类型上使用的任何转换器。

到目前为止,我看到的使用 CustomCreationConverters 和 ContractResolvers 的示例似乎解决了如何为正在序列化的主类替换序列化程序,而不是为仅是该类的属性的类型。涉及注释被覆盖的类的示例对我不起作用,因为我没有在我的代码中定义 DbGeography 并且它实际上是一个密封类,因为它没有构造函数并且只能由internal工厂方法实例化。

有没有办法将 JsonConverter 流利地应用于类型?如果是这样,转换器会是什么样子?我只是覆盖 WriteJson() 方法吗?

4

3 回答 3

50

您可以将自定义序列化程序添加到单个属性,如下所示:

public class Comment
{
    public string Author { get; set; }

    [JsonConverter(typeof(NiceDateConverter))]
    public DateTime Date { get; set; }

    public string Text { get; set; }
}

public class NiceDateConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var date = (DateTime) value;
        var niceLookingDate = date.ToString("MMMM dd, yyyy 'at' H:mm tt");
        writer.WriteValue(niceLookingDate);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException("Unnecessary because CanRead is false. The type will skip the converter.");
    }

    public override bool CanRead
    {
        get { return false; }
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(DateTime);
    }
}

然后,当您使用 JsonConvert.SerializeObject() 序列化对象时,自定义序列化程序将用于 Date 属性。

于 2015-05-06T17:42:06.453 回答
8

使用JsonConverterAttributeon 属性并定义一个自定义转换器-

例如,我们有一个作为 unix 值(long int)传入的属性,我们将其序列化为 .Net DateTime

[JsonConverter(typeof(UnixTimeJsonConverter))]
public DateTime Requested { get; set; }
于 2013-08-29T22:32:42.213 回答
8

原来我只需要从 JsonConverter 而不是 CustomCreationConverter 继承,而我试图改变的其他一切一直都很好。

我仍然不确定是否有一种方法可以流畅地应用 JsonConverter,但是还有另一种方法可以应用 JsonConverter,而无需在您的域/核心项目中引用 Json.NET 或使用对外围库的引用来标记您的域类:

var jsonSerializer = new JsonSerializer();
jsonSerializer.Converters.Add(new DbGeographyConverter());
jsonSerializer.Serialize(jsonWriter, place);
于 2013-08-29T23:41:46.710 回答