Skip to main content
 首页 » 编程设计

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

2024年11月01日18zlslch

更新
发现了问题-是从错误的类继承的,必须是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属性。