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

标签 serialization json.net

更新
发现了问题-是从错误的类继承的,必须是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()方法?

最佳答案

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

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 = value as DateTime;
        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属性。

关于serialization - Json.NET中仅一个属性的自定义序列化程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18521970/

相关文章:

c# - 如何将数据从 XML 恢复到 Windows 窗体?

c# - 如何将具有不同名称但具有相同属性集的 xml 元素反序列化为类型化数组/集合

c# - 如何将 JValue 转换为 bool?

asp.net - Json.Net IsoDateTimeConverter 不工作

java - 将 Guava 的 ArrayListMultimap 转换为可序列化映射

c# - 使用 CodeDOM 的公共(public) getter、 protected setter

java - 如何将缓存的 json 字符串与 gson 一起使用?

json - Windows Phone 8 JSON

c# - 将 json 响应转换为列表

json.net - 如何将 Json.NET 中缺失的属性反序列化为默认值?