Json.NET中仅一个属性的自定义序列化程序



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

我有一个类的Location属性类型为System.Data.Entity.Spatial.DbGeography。默认的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和ContractResolver的示例似乎解决了如何替换正在序列化的主类的序列化程序,而不是替换仅属于该类属性的类型。涉及注释被重写的类的示例对我不起作用,因为我在代码中没有定义DbGeography,而且它实际上是一个密封类,因为它没有构造函数,只能由internal工厂方法实例化。

有没有一种方法可以将JsonConverter流利地应用于类型?如果是,转换器会是什么样子?我只是重写WriteJson()方法吗?

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

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属性。

事实证明,我只需要从JsonConverter而不是CustomCreationConverter继承,我试图更改的其他一切都可以。

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

var jsonSerializer = new JsonSerializer();
jsonSerializer.Converters.Add(new DbGeographyConverter());
jsonSerializer.Serialize(jsonWriter, place);

在属性上使用JsonConverterAttribute并定义自定义转换器-

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

[JsonConverter(typeof(UnixTimeJsonConverter))]
public DateTime Requested { get; set; }

相关内容

  • 没有找到相关文章

最新更新