使用多个记录,未知密钥和未知数量的密钥对json进行反序列化

时间:2016-11-24 14:15:47

标签: c# json

我需要使用未知密钥和未知的密钥来反序列化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位。

如何摆脱这种异常?

4 个答案:

答案 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);
}