形式为Dictionary<string, Dictionary<string, string>>的Json反序列化

3
我正在尝试将形如 [{"key" : "Microsoft", "value":[{"Key":"Publisher","Value":"abc"},{"Key":"UninstallString","Value":"c:\temp"}]} and so on ] 的json字符串反序列化为C#对象。它基本上是一个 Dicionary<string, Dictionary<string, string>> 的形式。我尝试使用Newtonsoft的JsonConvert.Deserialize,但是出现了错误:
无法将当前JSON数组(例如[1,2,3])反序列化为类型'System.Collections.Generic.Dictionary`2[System.String,System.Collections.Generic.Dictionary`2[System.String,System.String]]',因为该类型需要一个JSON对象(例如{"name":"value"})才能正确反序列化。
要修复此错误,请将JSON更改为JSON对象(例如{"name":"value"}),或将反序列化类型更改为数组或实现集合接口(例如ICollection、IList)的类型,如可从JSON数组反序列化的List。也可以向类型添加JsonArrayAttribute,以强制其从JSON数组反序列化。 路径“”,行1,位置1。
是否有其他替代方法?

1
只需使用 var obj = JsonConvert.DeserializeObject(...)。它适用于您的 JSON 字符串。 - L.B
我目前正在进行这个操作... 字符串 jsonString = json; (其中包含上述格式的 JSON) var values = JsonConvert.DeserializeObject<Dictionary<string,Dictionary<string,string>>>(jsonString);...... 我仍然得到相同的错误。 - barry
我现在正在做这个。你为什么不尝试一下我发布的代码?我已经测试过它,它能正常工作。 - L.B
谢谢L.B.。但是我正在寻找一个类型为Dictionary<string,Dictionary<string,string>>的对象,因为我已经有了循环遍历这样一个对象并将这些值插入到数据库中的逻辑。 - barry
1个回答

6
我能提供的最佳方法是:

我找到的最佳方法是:

string json = @"[{""Key"" : ""Microsoft"", ""Value"":[{""Key"":""Publisher"",""Value"":""abc""},{""Key"":""UninstallString"",""Value"":""c:\temp""}]}]";

var list = JsonConvert.DeserializeObject< List<KeyValuePair<string,List<KeyValuePair<string, string>>>> >(json);

var dict= list.ToDictionary(
         x => x.Key, 
         x => x.Value.ToDictionary(y=>y.Key,y=>y.Value));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接