【问题标题】: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" }。)

    也许更好的名字是ToStringSerializerOneWayStringConverter

    【讨论】:

      猜你喜欢
      • 2016-08-14
      • 1970-01-01
      • 2011-08-02
      • 1970-01-01
      • 2019-01-06
      • 2018-07-29
      • 2023-03-06
      • 1970-01-01
      • 2015-08-04
      相关资源
      最近更新 更多