更新 发现问题 - 从错误的类继承,需要成为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()方法吗?
答案 0 :(得分:24)
您可以将自定义序列化程序添加到单个属性中,如下所示:
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属性。
答案 1 :(得分:7)
使用属性上的JsonConverterAttribute
并定义自定义转换器 -
例如,我们有一个以unix值(long int)形式出现的属性,我们将其序列化为.Net DateTime
:
[JsonConverter(typeof(UnixTimeJsonConverter))]
public DateTime Requested { get; set; }
答案 2 :(得分:5)
事实证明我只需要继承JsonConverter而不是CustomCreationConverter,而我试图改变的其他一切都是正常的。
我仍然不确定是否有一种方法可以流畅地应用JsonConverter,但是还有另一种方法可以应用JsonConverter,而无需在域/核心项目中引用Json.NET或使用对外围设备的引用来标记域类库:
var jsonSerializer = new JsonSerializer();
jsonSerializer.Converters.Add(new DbGeographyConverter());
jsonSerializer.Serialize(jsonWriter, place);