【问题标题】:Serialize class that provides ToString() [duplicate]序列化提供 ToString() 的类 [重复]
【发布时间】:2019-06-14 09:00:10
【问题描述】:
假设我有一些定义ToString()的类:
class Person {
public override string ToString() { /* ... */ }
}
假设某个模型中包含一个实例:
public Person Person { get; }
然后是这样序列化的:
"person": {
"value": "Foo Bar"
}
但我的预期是这样的:
"person": "Foo Bar"
我能以某种方式做到这一点,还是必须使用自定义转换器?
更新
不,这不是该链接问题的欺骗。这显示了如何对类型进行双向转换。我想做单向转换,因为我的类型已经有一个 ToString 方法 - 即仅序列化,而不是反序列化。
问题不在于如何编写类型转换器,而是在没有类型转换器的情况下是否可以实现这种单向序列化。
【问题讨论】:
标签:
c#
asp.net-core
json.net
asp.net-core-2.2
【解决方案1】:
我最近在一个项目中遇到了这个问题,我的团队唯一想到的就是必须编写一个类型转换器。
【解决方案2】:
我想要一种依赖于我的类型的ToString() 重载的单向转换。这适用于在服务器上序列化并用于 REST 响应的数据。
这就是我所做的:
public class StringConverter : JsonConverter {
public override bool CanConvert(Type objectType) {
return true;
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) {
throw new NotSupportedException("This one-way converter cannot be used for deserialization.");
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {
writer.WriteValue(value.ToString());
}
}
这样使用:
[JsonConverter(typeof(StringConverter))]
public Person Person { get; } // assumes Person has overloaded ToString()
而序列化的结果是这样的:
"person": "Foo Bar"
(而不是"person": { "value": "Foo Bar" }。)
也许更好的名字是ToStringSerializer 或OneWayStringConverter。