Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将具有元组和枚举的字典转换为JSON_C#_Enums_Json.net_Tuples - Fatal编程技术网

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;}
要求:

  • 转换为JSON时,changeType应为文本,而不是数字
  • 元组应使用项的名称而不是项1、项2和项3进行转换
  • 我所尝试的:

    • 至于枚举,我尝试将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(),因为它只适用于特定的值元组。我必须同意你的观点,将元组变成结构或类肯定会让我的生活更轻松。:)