【问题标题】:Deserialize json with multiple records, unknown keys and unknown number of keys使用多条记录、未知键和未知数量的键反序列化 json
【发布时间】:2016-11-24 22:51:55
【问题描述】:

我需要用未知键和未知数量的键反序列化 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);

但我收到了一个例外:

Newtonsoft.Json.dll 中出现“Newtonsoft.Json.JsonSerializationException”类型的异常,但未在用户代码中处理

附加信息:无法将当前 JSON 对象(例如 {"name":"value"})反序列化为类型“System.Collections.Generic.List1[System.Collections.Generic.Dictionary2[System.String,System.String]]”,因为该类型需要一个 JSON 数组(例如 [1,2,3])才能正确反序列化。

要修复此错误,请将 JSON 更改为 JSON 数组(例如 [1,2,3])或将反序列化类型更改为正常的 .NET 类型(例如,不是整数等原始类型,而不是可以从 JSON 对象反序列化的集合类型(如数组或列表)。 JsonObjectAttribute 也可以添加到类型中,以强制它从 JSON 对象反序列化。

路径“/APL/HVAC/TREG/EACT”,第 1 行,位置 23..

如何摆脱这个异常?

【问题讨论】:

    标签: c# json


    【解决方案1】:

    您的 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 可让您检查和编辑。

    【讨论】:

      【解决方案2】:

      试试这个:

      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】:

        您的 json 文件可能格式错误,它应该以 [ 开头并以 ] 结尾,以便以 Dictionary&lt;string, string&gt; 读取

        示例:

        [{"key1":"val01"}, {"key2":"val02"}, {"key3":"val03"}, ..., {"keyn":"val0n"}]
        

        【讨论】:

        • 我应该在每条记录[{...}][{...}][{...}] 上添加方括号,还是只在整个字符串上添加方括号? [{...}{...}{...}]
        • 整个字符串[{...}{...}{...}]
        【解决方案4】:

        我已经用这个解决了这个问题:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-01-06
          • 1970-01-01
          • 1970-01-01
          • 2013-02-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多