【问题标题】:Converting Dictionary with tuple and enum to JSON将带有元组和枚举的字典转换为 JSON
【发布时间】:2020-08-12 23:02:32
【问题描述】:

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

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))] 放在属性前面(不行)
  • 无法对命名元组提出任何建议

问题:

我可以在不编写自定义转换器来转换整个类的情况下实现上述目标吗?

谢谢!

【问题讨论】:

  • 你如何序列化你的字典实例?
  • 此外,“元组应转换为项目名称而不是项目 1、项目 2 和项目 3”无法实现,因为您的元组实际上是 ValueTuple&lt;T1,T2,T3&gt; 并且实际上没有 changTypeoldValuenewValue 成员。您需要为此创建类/结构。

标签: c# enums json.net tuples


【解决方案1】:

ValueTuple键的名字编译后基本不存在except for in some attributes,所以序列化器获取的类型信息中不包含名字。

所以你必须使用一个类来控制序列化的名称,而不是那个 ValueTuple。

【讨论】:

    【解决方案2】:

    其实并没有我想象的那么糟糕…… JsonConvert.SerializeObject() 已经很好地序列化了 Dictionary,所以我要做的就是帮助 Json 解释枚举和元组。

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

    在WriteJson()的实现中,我有以下几点:

    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();
    

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

    JsonConvert.SerializeObject(cc, Formatting.Indented, new CustomTupleConverter());
    

    就是这样。

    【讨论】:

    • 但是现在它将为 any (ChangeType, string, string) 元组调用,而不管其在 cc 中的成员名称如何。即使您后来决定重命名它,它也会将“Action”打印为属性名称。或者你如何实现CanWrite?这可能不是你想要的。此外,与此解决方案相比,创建 public class Change { public ChangeType Action { get; set;} public string OldValue { get;set; } public string NewValue { get; set; } } 的代码更少且更便携。
    • @CodeCaster...这是推荐...我们现在在带有元组的兔子洞中如此之深,将其转换为结构和类似乎不可行。要回答您关于 CanWrite() 的问题:由于我使用的是 JsonConverter,因此不需要覆盖 CanWrite(),因为它仅适用于特定的值元组。我必须同意你的观点,将元组设为结构或类肯定会让我的生活更轻松。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 2018-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    相关资源
    最近更新 更多