【发布时间】:2019-12-10 12:28:29
【问题描述】:
使用值元组键反序列化字典时出现错误。我认为它将元组转换为字符串,然后无法将其反序列化为键:
Newtonsoft.Json.JsonSerializationException
HResult=0x80131500
Message=Could not convert string '(1, 2)' to dictionary key type 'System.ValueTuple`2[System.Int32,System.Int32]'. Create a TypeConverter to convert from the string to the key type object. Path 'Types['(1, 2)']', line 1, position 49.
Source=Newtonsoft.Json
StackTrace:
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateDictionary(IDictionary dictionary, JsonReader reader, JsonDictionaryContract contract, JsonProperty containerProperty, String id)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.SetPropertyValue(JsonProperty property, JsonConverter propertyConverter, JsonContainerContract containerContract, JsonProperty containerProperty, JsonReader reader, Object target)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, String id)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)
at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)
at Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings)
at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value, JsonSerializerSettings settings)
at ConsoleApp.Program.Main(String[] args) in D:\Open Source\JsonSerilization\ConsoleApp\ConsoleApp\Program.cs:line 65
Inner Exception 1:
JsonSerializationException: Error converting value "(1, 2)" to type 'System.ValueTuple`2[System.Int32,System.Int32]'. Path 'Types['(1, 2)']', line 1, position 49.
Inner Exception 2:
ArgumentException: Could not cast or convert from System.String to System.ValueTuple`2[System.Int32,System.Int32].
对此有标准解决方案吗?
到目前为止,我似乎需要提供一个自定义转换器;这看起来很乏味。
更新:
这是我要序列化/反序列化的类:
public sealed class Message
{
[JsonConstructor]
internal Message()
{ }
public ISet<(int Id, int AnotherId)> Ids { get; set; }
= new HashSet<(int Id, int AnotherId)>();
public Dictionary<(int Id, int AnotherId), int> Types { get; set; }
= new Dictionary<(int Id, int AnotherId), int>();
}
这是我使用它的地方:
var message = new Message();
message.Ids.Add((1, 2));
message.Types[(1, 2)] = 3;
var messageStr = JsonConvert.SerializeObject(message);
var messageObj = JsonConvert.DeserializeObject<Message>(messageStr);
【问题讨论】:
-
一段定义原始结构+json字符串的代码在这里会很有帮助
-
@TobiasTengler 为什么不建议使用自定义转换器?
-
有标准解决方案吗? -- 是的。您可以序列化为数组,如How can I serialize/deserialize a dictionary with custom keys using Json.Net? 所示,或添加自定义
TypeConverter将元组转换为字符串,如Not ableTo Serialize Dictionary with Complex key using Json.net 所示。 -
另请注意Bug C#: Dictionary with tuple key #2022:这不是错误。当字典的字符串键时,并非所有类型的往返都会序列化。.
标签: c# dictionary json.net