解析 Json 文件 - Json 转换

Parse a Json File - JsonConvert

我有 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? 我需要从项目 class.

中获取所有项目

由于您的 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[]>();
        // ...
    }

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

试试这个,其中字典仅由您的模型项替换:

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

        }

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

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