【问题标题】:Parse a Json File - JsonConvert解析 Json 文件 - JsonConvert
【发布时间】:2020-04-12 19:07:39
【问题描述】:

我有 JSON 文件,例如:

[
  12,
  [
    {
      "id": "131",
      "name": "Cate"
    },
        {
      "id": "132",
      "name": "Mike"
    }
  ],
  "Result OK"
]

和代码:

        private static void Main(string[] args)
        {
                using (var r = new StreamReader(@"C:\Path\data1.json"))
                {
                    var json = r.ReadToEnd();
                    try
                    {
                        var items = JsonConvert.DeserializeObject<JsonBody>(json);
                        Console.WriteLine(items);
                    }
                    catch (JsonSerializationException ex)
                    {
                        Console.WriteLine(ex);
                    }
                }
        }
        public class JsonBody
        {
            public int someint;
            public List<Dictionary<string, Item>> item;
            public string somestring;

        }
        public class Item
        {
            [JsonProperty("id")] public string id;
            [JsonProperty("name")] public string name;
        }

错误:无法将当前 JSON 数组(例如 [1,2,3])反序列化为 'Json_parser.Parse2+JsonBody' 类型,因为该类型需要 JSON 对象(例如 {"name":"value" }) 以正确反序列化。

应该在代码中重写什么以避免此错误。 如何正确解析这个 JSON? 我需要从 Item 类中获取所有项目。

【问题讨论】:

  • 这个json的根对象是一个数组,包含3个元素,数字12,一个嵌套数组,字符串“Result OK”。您需要将其反序列化为对象数组或类似数组才能处理它。
  • @JohnathanBarclay 我从一个网站得到这个 json
  • @JohnathanBarclay 当然可以。即使这是有效的 json:"Result OK",它只是一个字符串,但它是有效的 JSON。
  • 试试这个:JToken root = JToken.Parse(json); var items = root[1].ToObject&lt;Item[]&gt;(); 不过你可能需要更多的错误检查。
  • @LasseV.Karlsen 我的错误。

标签: c# json-deserialization jsonconvert


【解决方案1】:

乍一看,问题出在我们用于反序列化的模型上。

试试这个,其中字典被你的模型项目替换:

        public class JsonBody
        {
            public int someint;
            public List<Item> item;
            public string somestring;

        }

正如@Lasse V. Karlsen 所提到的,它需要被反序列化为一个 JsonBody 列表,因此您还必须更改这行代码:

var items = JsonConvert.DeserializeObject<List<JsonBody>>(json);

【讨论】:

  • 很遗憾,JSON 文档的根不是一个对象,而是一个列表。
  • @LasseV.Karlsen 你确实是对的。因此还有另一行代码需要修改。我会编辑我的评论。非常感谢
【解决方案2】:

由于 JSON 文档的根是一个列表,因此您需要使用 Json.Net 将其反序列化为 C# 中的集合类型。不幸的是,这种混合元素类型的数据结构有点难以使用。

如果你 100% 知道文档的根始终是一个数组,你可以像这样反序列化它:

JArray root = JArray.Parse(json);

然后,如果您 100% 知道该数组的第二个元素将是您感兴趣的项目的嵌套数组,则可以使用:

Item[] items = root[1].ToObject<Item[]>();

所以你的方法可以简化为:

string json = File.ReadAllText(@"C:\Path\data1.json");
JArray root = JArray.Parse(json);
Item[] items = root[1].ToObject<Item[]>();

但是,如果你需要寻找嵌套数组,因为它并不总是第二个元素,你可以使用这个:

string json = File.ReadAllText(@"C:\Path\data1.json");
JArray root = JArray.Parse(json);
foreach (var element in root)
    if (element is JArray)
    {
        Item[] items = element.ToObject<Item[]>();
        // ...
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    • 1970-01-01
    • 2018-10-10
    • 2019-06-09
    相关资源
    最近更新 更多