考虑以下场景:
var toSerialize = new Dictionary<string, object> {
{ "0", new[] { 1, 2 } }
};
string serialized = JsonConvert.SerializeObject(toSerialize);
// serialized == {"0":[1,2]}
var deserialized = JsonConvert.DeserializeObject<Dictionary<string, object>>(serialized);
这将反序列化为 a Dictionary<string, object>
,其中键为“0”的数组包含 2 个整数。伟大的!
现在让我们试试这个:
var toSerialize = new Dictionary<string, object> {
{ "0", new Dictionary<string, object> { { "0.0", new[] { 1, 2 } } } }
};
string serialized = JsonConvert.SerializeObject(toSerialize);
// serialized == {"0":{"0.0":[1,2]}}
var deserialized = JsonConvert.DeserializeObject<Dictionary<string, object>>(serialized);
现在,deserialized["0"]
是一个 JObject。使用JsonSerializerSettings
DeserializeObject 的参数TypeNameHandling = TypeNameHandling.All
解决了这个问题。
现在,在我的实际场景中,字典对象周围还有另一个列表,这似乎是进一步反序列化的可能:
var toSerialize = new List<Dictionary<string, object>> { new Dictionary<string, object> {
{ "0", new Dictionary<string, object> { { "0.0", new[] { 1, 2 } } } }
} };
string serialized = JsonConvert.SerializeObject(toSerialize);
// serialized == [{"0":{"0.0":[1,2]}}]
var deserialized = JsonConvert.DeserializeObject<IList<Dictionary<string, object>>>(serialized, _jsonSettings);
在这里,deserialized[0]
是 a JObject
,我似乎无法说服 json.net 进一步反序列化为另一个Dictionary<string, object>
. 这可能吗?