Прочитайте и проанализируйте файл Json в C # от JsonConvert - PullRequest
0 голосов
/ 07 октября 2019

У меня есть 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.

Ответы [ 2 ]

0 голосов
/ 07 октября 2019

JSON, имеющий ключевую пару. Класс UpL не требуется. DeserializeObject as Dictionary

        using (var r = new StreamReader(@"C:\Users\Admin\Desktop\Json.json"))
        {
            var json = r.ReadToEnd();
            var items = JsonConvert.DeserializeObject<Dictionary<string, Item>>(json);
            foreach (var keyValuePair in items)
            {
                Console.WriteLine(keyValuePair.Value.name);
            }
        }
0 голосов
/ 07 октября 2019

Возможно, я немного ошибся в своем первом комментарии.

Я не думаю, что класс UpL необходим.

Вы можете десериализовать свой JSON как Dictionary<string, Item> вместоa 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();
...