1

我有 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 类中获取所有项目。

4

2 回答 2

1

由于 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[]>();
        // ...
    }
于 2019-12-20T09:11:24.213 回答
0

乍一看,问题来自我们用于反序列化的模型。

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

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

        }

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

var items = JsonConvert.DeserializeObject<List<JsonBody>>(json);
于 2019-12-20T09:25:36.087 回答