我需要使用未知密钥和未知的密钥来反序列化json文件
{"key1":"val01", "key2":"val02", "key3":"val03", ..., "keyn":"val0n"}
{"key1":"val11", "key2":"val12", "key3":"val13", ..., "keyn":"val1n"}
{"key1":"val21", "key2":"val22", "key3":"val23", ..., "keyn":"val2n"}
我不知道钥匙,甚至不知道n
。
我试图将其解析为词典列表:
res = JsonConvert.DeserializeObject<List<Dictionary<string, string>>>(jsontext);
但我收到了一个例外:
类型&#39; Newtonsoft.Json.JsonSerializationException&#39;的例外情况发生在Newtonsoft.Json.dll但未在用户代码中处理
附加信息:无法将当前JSON对象(例如{&#34; name&#34;:&#34; value&#34;})反序列化为类型System.Collections.Generic.List {{1 }} 2 [System.String,System.String]]&#39;因为该类型需要JSON数组(例如[1,2,3])才能正确反序列化。
要修复此错误,请将JSON更改为JSON数组(例如[1,2,3])或更改反序列化类型,使其成为普通的.NET类型(例如,不是像整数这样的基本类型,而不是可以从JSON对象反序列化的集合类型,如数组或List)。 JsonObjectAttribute也可以添加到类型中以强制它从JSON对象反序列化。
Path&#39; / APL / HVAC / TREG / EACT&#39;,第1行,第23位。
如何摆脱这种异常?
答案 0 :(得分:3)
你的json无效。您可以使用JSON Formatter
等工具验证json字符串列表的开头应为[
,最后应为]
。你还需要在元素之间加上逗号。
字符串的有效版本如下:
[
{
"key1": "val01",
"key2": "val02",
"key3": "val03",
"keyn": "val0n"
},
{
"key1": "val11",
"key2": "val12",
"key3": "val13",
"keyn": "val1n"
},
{
"key1": "val21",
"key2": "val22",
"key3": "val23",
"keyn": "val2n"
}
]
JSON Editor Online可让您查看和修改。
答案 1 :(得分:0)
您的json文件可能格式错误,应以[
开头,以]
结尾,以Dictionary<string, string>
例:
[{"key1":"val01"}, {"key2":"val02"}, {"key3":"val03"}, ..., {"keyn":"val0n"}]
答案 2 :(得分:0)
试试这个:
using Newtonsoft.Json.Linq;
string json = "[{\"key1\":\"val01\", \"key2\":\"val02\", \"key3\":\"val03\", \"keyn\":\"val0n\"}, {\"key1\":\"val11\", \"key2\":\"val12\", \"key3\":\"val13\", \"keyn\":\"val1n\"}, {\"key1\":\"val21\", \"key2\":\"val22\", \"key3\":\"val23\", \"keyn\":\"val2n\"}]";
var objects = JArray.Parse(json); // parse as array
foreach(JObject obj in objects)
{
foreach(KeyValuePair<String, JToken> pair in obj)
{
Console.WriteLine(pair.Key + " -> " + pair.Value);
}
}
答案 3 :(得分:0)
我用这个来处理这个问题:
var result = new List<Dictionary<string, string>>();
var jsons = jsontext.Split('\n');
foreach (var x in jsons)
{
var res = JsonConvert.DeserializeObject<Dictionary<string, string>>(x);
result.Add(res);
}