C# 将具有元组和枚举的字典转换为JSON
在我的类中,我有一个枚举定义,如下所示:C# 将具有元组和枚举的字典转换为JSON,c#,enums,json.net,tuples,C#,Enums,Json.net,Tuples,在我的类中,我有一个枚举定义,如下所示: public enum ChangeType { [EnumMember(Value ="Added")] Added, [EnumMember(Value = "Removed")] Removed, [EnumMember(Value = "Updated")] Updated } 在类定义中,我有一个属性: public Dictionary<st
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; }
公共
字典
PropertyChanges{get;set;}
要求:
- 至于枚举,我尝试将JsonConverter(typeof(StringEnumConverter))]放在属性前面(no go)
- 无法提供有关命名元组的任何建议
谢谢 编译后ValueTuple键的名称基本上不存在,因此序列化程序获取的类型信息不包含这些名称
因此,您必须使用类来控制序列化名称,而不是ValueTuple。编译后,ValueTuple键的名称基本上不存在,因此序列化程序获取的类型信息不包含这些名称
因此,您必须使用一个类来控制序列化名称,而不是ValueTuple。它实际上没有我想象的那么糟糕。。。 SerializeObject()已经很好地序列化了字典,所以我所要做的就是帮助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());
就是这样。事实上没有我想象的那么糟。。。 SerializeObject()已经很好地序列化了字典,所以我所要做的就是帮助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());
就是这样。如何序列化词典的实例?另外,“Tuple应该转换为项的名称而不是Item1、Item2和Item3”,无法实现,因为您的Tuple实际上是
ValueTuple
,并且实际上没有changType
,oldValue
,newValue
成员。您需要为此创建类/结构。如何序列化词典的实例?另外,由于您的元组实际上是ValueTuple
,并且实际上没有changType
,oldValue
,因此无法实现“Tuple应该转换为项的名称,而不是Item1、Item2和Item3”,newValue
成员。您将需要为此创建类/结构。但现在将为任何(ChangeType,string,string)
元组调用它,而不管它在cc
中的成员名称如何。它还将打印“Action”作为属性名,即使您以后决定重命名它。或者如何实现CanWrite
?这可能不是你想要的。另外,创建一个public类Change{public ChangeType Action{get;set;}public string OldValue{get;set;}public string NewValue{get;set;}
比这个解决方案的代码要少得多,可移植性也更高。@CodeCaster…这是一个建议…我们现在在元组的兔子洞里陷得太深了,用结构和类转换它似乎不可行。回答您关于CanWrite()的问题:因为我使用的是JsonConverter,所以不需要重写CanWrite(),因为它只适用于特定的值元组。我必须同意你的观点,将元组变成结构或类肯定会让我的生活更轻松。:)但是现在它将被任何(ChangeType,string,string)
元组调用,而不管它在cc
中的成员名如何。它还将打印“Action”作为属性名,即使您以后决定重命名它。或者如何实现CanWrite
?这可能不是你想要的。另外,创建一个public类Change{public ChangeType Action{get;set;}public string OldValue{get;set;}public string NewValue{get;set;}
比这个解决方案的代码要少得多,可移植性也更高。@CodeCaster…这是一个建议…我们现在在元组的兔子洞里陷得太深了,用结构和类转换它似乎不可行。回答您关于CanWrite()的问题:因为我使用的是JsonConverter,所以不需要重写CanWrite(),因为它只适用于特定的值元组。我必须同意你的观点,将元组变成结构或类肯定会让我的生活更轻松。:)