首页 > 解决方案 > 通过 JsonConvert 在 C# 中读取和解析 Json 文件

问题描述

我有 JSON 文件,如:

        {
          "50": {
            "docid": "5611",
            "code": "ГОСТ 11529-2016",
            "name": "Материалы поливинилхлоридные для полов. Методы контроля",
            "type_id": "6",
            "status": "0"
          },
          "51": {
            "docid": "509",
            "code": "ГОСТ 11583-74",
            "name": "Материалы полимерные строительные отделочные. Методы определения цветоустойчивости под воздействием света, равномерности окраски и светлоты",
            "type_id": "6",
            "status": "0"
          },
          ...................................................................................
          "4000": {
            "docid": "5611",
            "code": "ГОСТ 11529-2016",
            "name": "Материалы поливинилхлоридные для полов. Методы контроля",
            "type_id": "6",
            "status": "0"
          },

       }

和代码:

        private static void Main(string[] args)
        {
            using (var r = new StreamReader(@"C:\Users\Admin\Desktop\Json.json"))
            {
                var json = r.ReadToEnd();
                var items = JsonConvert.DeserializeObject<List<UpL>>(json);
                foreach(var item in items)
                {
                    foreach (var i in item)
                    {
                        Console.WriteLine(i.name);
                    }
                }
            }

        }

        public class UpL 
        {
            public Item item { get; set; }
        }

        public class Item
        {
            [JsonProperty("docid")] public string docid;
            [JsonProperty("code")] public string code;
            [JsonProperty("name")] public string name;
            [JsonProperty("status")] public string status;
            [JsonProperty("type_id")] public string type_id;
        }

错误:类型对象不能在 foreach 语句中使用。

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

标签: c#jsonparsingjson.net

解决方案


我的第一条评论可能有点错误。

我觉得UpL上课没必要。

您可以将 JSON 反序列Dictionary<string, Item>化为List<T>

var dict = JsonConvert.DeserializeObject<Dictionary<string, Item>>(json);

这也是我遇到这种 JSON 时犯的一个错误。

现在,如果您只想要这些项目,您可以在其上运行一些 LINQ 以仅选择这些项目:

var items = dict.Select(x => x.Value).ToList();

编辑

这是我的工作示例:

        var json = @"{
      ""50"": {
        ""docid"": ""5611"",
        ""code"": ""ГОСТ 11529-2016"",
        ""name"": ""Материалы поливинилхлоридные для полов. Методы контроля"",
        ""type_id"": ""6"",
        ""status"": ""0""
      },
      ""51"": {
        ""docid"": ""509"",
        ""code"": ""ГОСТ 11583-74"",
        ""name"": ""Материалы полимерные строительные отделочные. Методы определения цветоустойчивости под воздействием света, равномерности окраски и светлоты"",
        ""type_id"": ""6"",
        ""status"": ""0""
      },
      ""4000"": {
        ""docid"": ""5611"",
        ""code"": ""ГОСТ 11529-2016"",
        ""name"": ""Материалы поливинилхлоридные для полов. Методы контроля"",
        ""type_id"": ""6"",
        ""status"": ""0""
      }
   }";
        var dict = JsonConvert.DeserializeObject<Dictionary<string, Item>>(json);
        var items = dict.Select(x => x.Value).ToList();

推荐阅读