将具有元组和枚举的Dictionary转换为JSON

问题描述

在我的课堂上,我有一个如下的枚举定义:

public enum ChangeType { 
  [EnumMember(Value ="Added")]
  Added,[EnumMember(Value = "Removed")]
  Removed,[EnumMember(Value = "Updated")]
  Updated 
}

类定义中,我有一个属性

public 
  Dictionary<string,(ChangeType changType,string oldValue,string newValue)> 
  PropertyChanges { get; set; }

要求:

  1. 转换为JSON时,changeType应该为文本,而不是数字
  2. 应使用项目名称而不是Item1,Item2和Item3来转换元组

我尝试过的事情:

  • 至于枚举,我尝试将JsonConverter(typeof(StringEnumConverter))]放在属性前面(不行)
  • 关于命名元组的任何建议

问题:

是否可以在不编写自定义转换器来转换整个类的情况下实现以上要求?

谢谢!

解决方法

{Tutorial} except for in some attributes在编译后基本上不存在ValueTuple键的名称,因此序列化程序获取的类型信息不包含名称。

因此,您必须使用一个类来控制序列化的名称,而不是该ValueTuple。

,

实际上还没有我想的那么糟... JsonConvert.SerializeObject()已经很好地完成了Dictionary 的序列化工作,所以我要做的就是帮助Json解释枚举和元组。

首先,我创建一个名为 CustomTupleConverter 的类,该类实现 JsonConverter

在WriteJson()的实现中,我具有以下内容:

intellij

当调用 JsonConvert.SerializeObject()时,我只需将转换器的实例化添加到调用中即可:

writer.WriteStartObject();
writer.WritePropertyName("Action");
writer.WriteValue(value.changeType.ToString());
writer.WritePropertyName("OldValue");
writer.WriteValue(value.oldValue.ToString());
writer.WritePropertyName("NewValue");
writer.WriteValue(value.newValue.ToString());
writer.WriteEndObject();

就是这样。