C# 使用 JSON.NET 反序列化字典 <(Enum,Enum),string>
C# Deserializing a Dictionary<(Enum,Enum),string> with JSON.NET
我一直在努力用 Json.Net 中的枚举元组键反序列化字典。
主要问题是反序列化器无法将值转换回指定的 Enum 元组,无论它是 Json.
中的 Enum 的字符串还是整数表示
我已经尝试过这些解决方案,但 none 有效:
尝试编写我自己的自定义转换器,WriteJson 部分有效,但我什至无法使用断点停止 ReadJson 函数以查看内部发生的情况。
我很乐意就此问题获得一些帮助。也许有人已经有了解决方案。
JSON 看起来像这样:
{
"DictionaryProperty":{
"(EnumType1Value1, EnumType2Value1)":"New",
"(EnumType1Value1, EnumType2Value1)":"Old",
"(EnumType1Value2, EnumType2Value1)":"Newer",
"(EnumType1Value2, EnumType2Value2)":"Older"
}
这是我得到的错误:
"Could not convert string '(EnumType1Value1, EnumType2Value1)' to dictionary key type 'System.ValueTuple`2[EnumType1,EnumType2]'"
这是我写的自定义转换器:
public class CustomDictionaryConverter : JsonConverter<Dictionary<(EnumType1 Enum1, EnumType2 Enum2), string>>
{
public override void WriteJson(JsonWriter writer, Dictionary<(EnumType1 Enum1, EnumType2 Enum2), string> value, JsonSerializer serializer)
{
serializer.Serialize(writer, ((Dictionary<(EnumType1 Enum1, EnumType2 Enum2), string>)value).ToList());
}
public override Dictionary<(EnumType1 Enum1, EnumType2 Enum2), string> ReadJson(
JsonReader reader
, Type objectType
, Dictionary<(EnumType1 Enum1, EnumType2 Enum2), string> existingValue
, bool hasExistingValue
, JsonSerializer serializer)
{
Dictionary<(EnumType1 Enum1, EnumType2 Enum2), string> tempdict = new Dictionary<(EnumType1 Enum1, EnumType2 Enum2), string>();
var temp = serializer.Deserialize<Dictionary<(EnumType1 Enum1, EnumType2 Enum2), string>[]>(reader)[0];
tempdict = (Dictionary<(EnumType1 Enum1, EnumType2 Enum2), string>)temp;
return tempdict;
}
}
有点手动(并且缺乏适当的错误检查),但适用于您指定的json序列化和反序列化
public class CustomDictionaryConverter : JsonConverter<Dictionary<(EnumType1 Enum1, EnumType2 Enum2), string>>
{
public override void WriteJson(JsonWriter writer, Dictionary<(EnumType1 Enum1, EnumType2 Enum2), string> value, JsonSerializer serializer)
{
writer.WriteStartObject();
foreach(var kv in value)
{
writer.WritePropertyName($"({kv.Key.Enum1.ToString()},{kv.Key.Enum2.ToString()})");
writer.WriteValue(kv.Value);
}
writer.WriteEndObject();
}
public override Dictionary<(EnumType1 Enum1, EnumType2 Enum2), string> ReadJson(
JsonReader reader
, Type objectType
, Dictionary<(EnumType1 Enum1, EnumType2 Enum2), string> existingValue
, bool hasExistingValue
, JsonSerializer serializer)
{
Dictionary<(EnumType1 Enum1, EnumType2 Enum2), string> tempdict = new Dictionary<(EnumType1 Enum1, EnumType2 Enum2), string>();
JObject jObject = JObject.Load(reader);
foreach(var kv in ((IEnumerable<KeyValuePair<string, JToken>>)jObject))
{
var keys = kv.Key.Replace("(","").Replace(")","").Split(",");
var key1 = Enum.Parse<EnumType1>(keys[0]);
var key2 = Enum.Parse<EnumType2>(keys[1]);
var value = kv.Value.ToString();
tempdict.Add((key1,key2),value);
}
return tempdict;
}
}
我一直在努力用 Json.Net 中的枚举元组键反序列化字典。 主要问题是反序列化器无法将值转换回指定的 Enum 元组,无论它是 Json.
中的 Enum 的字符串还是整数表示我已经尝试过这些解决方案,但 none 有效:
尝试编写我自己的自定义转换器,WriteJson 部分有效,但我什至无法使用断点停止 ReadJson 函数以查看内部发生的情况。
我很乐意就此问题获得一些帮助。也许有人已经有了解决方案。
JSON 看起来像这样:
{
"DictionaryProperty":{
"(EnumType1Value1, EnumType2Value1)":"New",
"(EnumType1Value1, EnumType2Value1)":"Old",
"(EnumType1Value2, EnumType2Value1)":"Newer",
"(EnumType1Value2, EnumType2Value2)":"Older"
}
这是我得到的错误:
"Could not convert string '(EnumType1Value1, EnumType2Value1)' to dictionary key type 'System.ValueTuple`2[EnumType1,EnumType2]'"
这是我写的自定义转换器:
public class CustomDictionaryConverter : JsonConverter<Dictionary<(EnumType1 Enum1, EnumType2 Enum2), string>>
{
public override void WriteJson(JsonWriter writer, Dictionary<(EnumType1 Enum1, EnumType2 Enum2), string> value, JsonSerializer serializer)
{
serializer.Serialize(writer, ((Dictionary<(EnumType1 Enum1, EnumType2 Enum2), string>)value).ToList());
}
public override Dictionary<(EnumType1 Enum1, EnumType2 Enum2), string> ReadJson(
JsonReader reader
, Type objectType
, Dictionary<(EnumType1 Enum1, EnumType2 Enum2), string> existingValue
, bool hasExistingValue
, JsonSerializer serializer)
{
Dictionary<(EnumType1 Enum1, EnumType2 Enum2), string> tempdict = new Dictionary<(EnumType1 Enum1, EnumType2 Enum2), string>();
var temp = serializer.Deserialize<Dictionary<(EnumType1 Enum1, EnumType2 Enum2), string>[]>(reader)[0];
tempdict = (Dictionary<(EnumType1 Enum1, EnumType2 Enum2), string>)temp;
return tempdict;
}
}
有点手动(并且缺乏适当的错误检查),但适用于您指定的json序列化和反序列化
public class CustomDictionaryConverter : JsonConverter<Dictionary<(EnumType1 Enum1, EnumType2 Enum2), string>>
{
public override void WriteJson(JsonWriter writer, Dictionary<(EnumType1 Enum1, EnumType2 Enum2), string> value, JsonSerializer serializer)
{
writer.WriteStartObject();
foreach(var kv in value)
{
writer.WritePropertyName($"({kv.Key.Enum1.ToString()},{kv.Key.Enum2.ToString()})");
writer.WriteValue(kv.Value);
}
writer.WriteEndObject();
}
public override Dictionary<(EnumType1 Enum1, EnumType2 Enum2), string> ReadJson(
JsonReader reader
, Type objectType
, Dictionary<(EnumType1 Enum1, EnumType2 Enum2), string> existingValue
, bool hasExistingValue
, JsonSerializer serializer)
{
Dictionary<(EnumType1 Enum1, EnumType2 Enum2), string> tempdict = new Dictionary<(EnumType1 Enum1, EnumType2 Enum2), string>();
JObject jObject = JObject.Load(reader);
foreach(var kv in ((IEnumerable<KeyValuePair<string, JToken>>)jObject))
{
var keys = kv.Key.Replace("(","").Replace(")","").Split(",");
var key1 = Enum.Parse<EnumType1>(keys[0]);
var key2 = Enum.Parse<EnumType2>(keys[1]);
var value = kv.Value.ToString();
tempdict.Add((key1,key2),value);
}
return tempdict;
}
}