3

我正在尝试反序列化 JSON 字符串

[{ "key" : "1", "value" : "open"}, {"key" : "2", "value" : "closed"}, {"key" : "3", "value" : "pending"}]

到 C# 数组中。我收到错误“没有为 'System.Array' 类型定义的无参数构造函数。” 我从数据库中提取 JSON,然后我想反序列化它,以便我可以访问值并使用用户传入的任何内容更新数据库中的另一个字段。这只是我正在尝试的一个示例,我需要它是动态的,而不是静态的,因为数据库中包含的 JSON 字符串可以是可变的。

我之前尝试过使用字典,但没有运气。所以我现在尝试一种不同的方法,将它反序列化为一个数组,然后我打算从数组中填充字典。

这是我目前正在尝试实施的方法……尽管我尝试了其他几种方法……

 IList<Array> ValueArray = new JavaScriptSerializer().Deserialize<IList<Array>>(this.Parameter.ValueList); 
 //this.Parameter.ValueList just contains my JSON string

我在想如果不创建自己的课程就不能做到这一点?

当我尝试使用字典时,我尝试了这个

Dictionary<string, string> ValueList =
                JsonConvert.DeserializeObject<Dictionary<string, string>>(this.Parameter.ValueList);  

但收到此错误

“无法将当前 JSON 数组(例如 [1,2,3])反序列化为类型 'System.Collections.Generic.Dictionary`2[System.String,System.String]',因为该类型需要 JSON 对象(例如 {” name":"value"}) 以正确反序列化。要修复此错误,请将 JSON 更改为 JSON 对象(例如 {"name":"value"})或将反序列化的类型更改为数组或实现集合接口(例如 ICollection、IList),例如可以从 JSON 数组反序列化的 List。也可以将 JsonArrayAttribute 添加到类型以强制它从 JSON 数组反序列化。路径'',第 1 行,位置 1。

所以我开始尝试使用数组。

4

3 回答 3

7
var list = new JavaScriptSerializer().Deserialize<List<KeyValue>>(json);

public class KeyValue
{
    public string key;
    public string value;
}

或者只是KeyValue暂时使用

var dict = new JavaScriptSerializer().Deserialize<List<KeyValue>>(json)
                                     .ToDictionary(x => x.key, x => x.value);

如果您愿意使用Json.Net,您可以直接将其转换为 Dictionary

var dict = JsonConvert.DeserializeObject<JArray>(json)
                     .ToDictionary(x => (string)x["key"], x => (string)x["value"]);
于 2012-07-25T17:51:55.270 回答
2

尝试

List<Dictionary<string, string>> ValueList = JsonConvert.DeserializeObject<List<Dictionary<string, string>>>(this.Parameter.ValueList);

但我不确定该库是否支持它。

于 2012-07-25T17:42:46.543 回答
0

我刚刚想通了。您需要为字典使用特定的语法。当我第一次尝试解决这个问题时,我检查的第一件事是我的 JSON 字符串(我使用 JSONLint.com),它确实是有效的,这让我摆脱了这个错误的气味......

但是我只是通过获取字典并对其进行序列化来对其进行了更多测试,以查看 JSON 的样子......所以我的 JSON 的语法应该是什么来转换为字典是这样的

{“1”:“待定”,“2”:“打开”,“3”:“关闭”}

于 2012-07-25T18:24:02.020 回答