提供ToString()的序列化类

时间:2019-06-14 09:00:10

标签: c# asp.net-core json.net asp.net-core-2.2

假设我有一些定义ToString()的类:

class Person {
  public override string ToString() { /* ... */ }
}

并假设某个实例包含在某些模型中:

public Person Person { get; }

然后按如下所示进行序列化:

"person": {
  "value": "Foo Bar"
}

但是我期望的是:

"person": "Foo Bar"

我可以以某种方式执行此操作,还是必须使用自定义转换器?


更新

不,这不是该链接问题的重复。这说明了如何对类型进行双向转换。考虑到我的类型已经具有ToString方法,我想进行单向转换-即仅序列化,而不是反序列化。

问题不在于如何编写类型转换器-而是在没有类型转换器的情况下这种单向串行化是否可行。

2 个答案:

答案 0 :(得分:1)

我最近在一个项目中遇到了这个问题,而我的团队唯一想到的就是必须编写一个类型转换器。

答案 1 :(得分:0)

我想要一种单向转换,该转换依赖于我的类型的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" }。)

也许更好的名字是ToStringSerializerOneWayStringConverter