Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 03.10.2018
Сообщений: 3

Десериализация json в list<T>, работа с объектами класса

08.05.2019, 14:05. Показов 3327. Ответов 6

Студворк — интернет-сервис помощи студентам
Всем здравствуйте!

Помогите пожалуйста разобраться со следующей задачей:
есть к примеру файл json.txt:
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
[
{
      "openShift": {
          "code": 2,
          "user": "",
          "userInn": "6699009482",
          "operator": "Герман Илья",
          "retailPlaceAddress": "",
          "dateTime": "2018-08-27T10:00:00",
          "shiftNumber": 367,
          "kktRegId": "0000000003065868    ",
          "fiscalDriveNumber": "99990788607     ",
          "fiscalDocumentNumber": 39089,
          "fiscalSign": 2034496394
      }
  },
  {
      "receipt": {
          "receiptCode": 3,
          "user": "ООО Золотой пятачок",
          "userInn": "6699009482",
          "requestNumber": 1,
          "dateTime": "2018-08-27T10:13:51",
          "shiftNumber": 367,
          "operationType": 1,
          "taxationType": 1,
          "operator": "Герман Илья",
          "kktRegId": "0000000003065868    ",
          "fiscalDriveNumber": "99990788607     ",
          "retailPlaceAddress": "г. Екатеринбург. ул. Малопрудная 5",
          "items": [
              {
                  "name": "Ассорти овощное помидоры,огурцы ст/б \"Золотая Долина\" 720 гр",
                  "price": 5668,
                  "quantity": 2,
                  "sum": 11336
              }
          ],
          "nds18": 1234,
          "totalSum": 11336,
          "cashTotalSum": 11336,
          "ecashTotalSum": 0,
          "fiscalDocumentNumber": 39090,
          "fiscalSign": 3635260533
      }
  },
  {
     "closeShift": {
            "code": 5,
            "user": "ООО \"Золотой пятачок\"",
            "userInn": "6699009482",
            "operator": "Иван Петров",
            "dateTime": "2018-10-30T10:00:00",
            "shiftNumber": 3,
            "receiptsQuantity": 3,
            "documentsQuantity": 3,
            "notTransmittedDocumentsQuantity": 1,
            "notTransmittedDocumentsDateTime": "2018-10-30T09:00:00",
            "ofdResponseTimeoutSign": 0,
            "fiscalDriveReplaceRequiredSign": 0,
            "fiscalDriveMemoryExceededSign": 1,
            "fiscalDriveExhaustionSign": 1,
            "fiscalDocumentNumber": 34,
            "fiscalDriveNumber": "99990788603",
            "fiscalSign": 3423453811
        }
    }
  ]
Создан класс Tickets

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
public class Tickets
    {
        public OpenShift openShift { get; set; }
        public Receipt receipt { get; set; }
        public CloseShift closeShift { get; set; }
    }
 
    public class OpenShift
    {
        public int code { get; set; }
        public string user { get; set; }
        public string userInn { get; set; }
        public string @operator { get; set; }
        public string retailPlaceAddress { get; set; }
        public DateTime dateTime { get; set; }
        public string shiftNumber { get; set; }
        public string kktRegId { get; set; }
        public string fiscalDriveNumber { get; set; }
        public string fiscalDocumentNumber { get; set; }
        public string fiscalSign { get; set; }
    }
 
    public class Receipt
    {
        public int receiptCode { get; set; }
        public string user { get; set; }
        public string userInn { get; set; }
        public string requestNumber { get; set; }
        public DateTime dateTime { get; set; }
        public string shiftNumber { get; set; }
        public string operationType { get; set; }
        public string taxationType { get; set; }
        public string @operator { get; set; }
        public string kktRegId { get; set; }
        public string fiscalDriveNumber { get; set; }
        public string nds20 { get; set; }
        public string nds10 { get; set; }
        public string totalSum { get; set; }
        public string cashTotalSum { get; set; }
        public string ecashTotalSum { get; set; }
        public string fiscalDocumentNumber { get; set; }
        public long fiscalSign { get; set; }
    }
 
    public class CloseShift
    {
        public int code { get; set; }
        public string user { get; set; }
        public string userInn { get; set; }
        public string @operator { get; set; }
        public DateTime dateTime { get; set; }
        public string shiftNumber { get; set; }
        public string receiptsQuantity { get; set; }
        public string documentsQuantity { get; set; }
        public string notTransmittedDocumentsQuantity { get; set; }
        public DateTime notTransmittedDocumentsDateTime { get; set; }
        public string ofdResponseTimeoutSign { get; set; }
        public string fiscalDriveReplaceRequiredSign { get; set; }
        public string fiscalDriveMemoryExceededSign { get; set; }
        public string fiscalDriveExhaustionSign { get; set; }
        public string kktRegId { get; set; }
        public string fiscalDriveNumber { get; set; }
        public string fiscalDocumentNumber { get; set; }
        public long fiscalSign { get; set; }
    }
Далее, десериализую файл в ticketlist

C#
1
2
3
4
5
6
7
8
List<Tickets> ticketlist;
    string path = "\\json.txt";
    void Page_Load(object sender, EventArgs e)
    {
 
        ticketlist = JsonConvert.DeserializeObject<List<Tickets>>(File.ReadAllText(path));
 
    }
на выходе чтобы получить dateTime из openShift (к примеру) пишу:
C#
1
result = ticketlist[0].openShift.dateTime.ToString();
чтобы обратиться к dateTime Receipt пишу соответственно:
C#
1
result = ticketlist[1].receipt.dateTime.ToString()
Все просто, все работает, но задачав том, что в файле ответа json.txt - OpenShift, Receipt и CloseShift записываются в хаотичном порядке и я не знаю по какому id в списке обращаться к openShift.dateTime к примеру.
Подскажите как грамотно получить dateTime всех openShift из списка?
Пробовал делать через цикл попеременно меняя значение id в списке:

C#
1
2
3
4
5
6
7
8
9
10
11
for (int o = 0; o < ticketlist.Count; o++)
  {
    try
        {
          if (ticketlist[o].openShift != null | ticketlist[o].openShift.ToString() == "OpenShift")
          {
            openSHdt = ticketlist[o].openShift.dateTime;
          }
        }
   catch { }
 }
Добавлено через 7 минут
Может возможно как то загнать все OpenShift, Receipt и CloseShift каждый в свой list?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.05.2019, 14:05
Ответы с готовыми решениями:

Десериализация json в list
Здравствуйте, уважаемые форумчане. Обращаюсь к вам за помощью со следующей проблемой: Требуется из данного файла input.json: { ...

Сериализация-десериализация коллекции list, используя Newtonsoft.Json
Как сериализация-десериализация коллекцию list,используя Newtonsoft.Json? public class Track { public string Artist...

Реализуйте интерфейс динамической структуры list для работы с объектами класса А
Добрый день товарищи программисты. Столкнулся с задачей и никак не могу решить... Так вот вопросы по заданию заключаются в следующем: ...

6
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16125 / 11249 / 2888
Регистрация: 21.04.2018
Сообщений: 33,082
Записей в блоге: 2
08.05.2019, 14:28
Лучший ответ Сообщение было отмечено iluzikov как решение

Решение

Цитата Сообщение от iluzikov Посмотреть сообщение
Все просто, все работает, но задачав том, что в файле ответа json.txt - OpenShift, Receipt и CloseShift записываются в хаотичном порядке и я не знаю по какому id в списке обращаться к openShift.dateTime к примеру.
result - это у Вас список типизированный типом Tickets.
После десериализации Вы получаете список экземпляров Tickets в котором у каждого экземпляра установлено только одно из свойств.
Если это всегда так и не надо проверять на корректность, то получить первые не нулевые свойства можно так:
C#
1
2
3
OpenShift openShift = result.FirstOrDefault(item => item.openShift != null)?.openShift;
Receipt receipt= result.FirstOrDefault(item => item.receipt!= null)?.receipt;
CloseShift closeShift= result.FirstOrDefault(item => item.closeShift != null)?.closeShift;
Добавлено через 4 минуты
Цитата Сообщение от iluzikov Посмотреть сообщение
Подскажите как грамотно получить dateTime всех openShift из списка?
C#
1
2
Ienumerable<DateTime> openShiftDateTime = result.Where(item => item.openShift != null)
               .Select(item => item.openShift.datetime);
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16125 / 11249 / 2888
Регистрация: 21.04.2018
Сообщений: 33,082
Записей в блоге: 2
08.05.2019, 14:30
Цитата Сообщение от iluzikov Посмотреть сообщение
Может возможно как то загнать все OpenShift, Receipt и CloseShift каждый в свой list?
C#
1
2
3
Ienumerable<OpenShift> openShifts = result.Where(item => item.openShift != null)
              .Select(item => item.openShift);
List<OpenShift> openShiftsList = openShifts.ToList();
1
0 / 0 / 0
Регистрация: 03.10.2018
Сообщений: 3
08.05.2019, 14:37  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
result - это у Вас список типизированный типом Tickets.
result - просто строка, для проверки и вывода на страницу. Типизированный список это - ticketlist. Подставил в ваш вариант ответа - все получилось, спасибо огромное!!! (неделю носил в себе прежде чем написать сюда)
0
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
08.05.2019, 14:39
Всем здравствуйте!
В данном случае можно всё упростить.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using Newtonsoft.Json.Linq;
using System;
using System.IO;
using System.Linq;
 
namespace Question2449645_JObject
{
    class Program
    {
        static string path = @"c:\Temp\json2449645.json";
 
        static void Main(string[] args)
        {
            var str = File.ReadAllText(path);
            var array = JArray.Parse(str).SelectMany(e =>
            {
                var os = e.Value<JToken>("openShift");
                if (os != null)
                    return new DateTime[] { os.Value<DateTime>("dateTime") };
                else
                    return new DateTime[0];
 
            });
 
            Console.WriteLine(string.Join("\n", array));
            Console.ReadKey();
        }
    }
}
Общее правило - если на выходе получилась тонна Г-кода, то её можно выкинуть.
1
0 / 0 / 0
Регистрация: 03.10.2018
Сообщений: 3
08.05.2019, 14:57  [ТС]
Цитата Сообщение от amr-now Посмотреть сообщение
В данном случае можно всё упростить.
Спасибо, нужно все это переварить)
0
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
08.05.2019, 15:29
iluzikov, если действительно будет обработка нескольких полей каждого класса, то можно разбить на три списка и обрабатывать их независимо:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
    class Program
    {
        static string path = @"c:\Temp\json2449645.json";
 
        static void Main(string[] args)
        {
            var str = File.ReadAllText(path);
 
            var openShiftList = new List<OpenShift>();
            var receiptList = new List<Receipt>();
            var closeShiftList = new List<CloseShift>();
 
            foreach (var e in JArray.Parse(str))
            {
                var obj = e.Value<JToken>("openShift");
                if (obj != null)
                    openShiftList.Add(JsonConvert.DeserializeObject<OpenShift>(obj.ToString()));
                obj = e.Value<JToken>("receipt");
                if (obj != null)
                    receiptList.Add(JsonConvert.DeserializeObject<Receipt>(obj.ToString()));
                obj = e.Value<JToken>("closeShift");
                if (obj != null)
                    closeShiftList.Add(JsonConvert.DeserializeObject<CloseShift>(obj.ToString()));
            }
            Console.WriteLine(string.Join("\n", openShiftList.Select(e => e.dateTime)));
            Console.ReadKey();
        }
    }
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.05.2019, 15:29
Помогаю со студенческими работами здесь

Работа с объектами внутри класса.
Вот два класса подскажите что здесь не так. Функция sh класса Engine должна вызвать функцию showhello класса Obj #pragma once ...

Работа с двумя объектами класса одновременно
Здравствуйте. Есть класс Цветы, у него два объекта: Роза и Тюльпан. Они имеют здоровье (health), рост (growth), когда цветы...

Работа с объектами класса Paint.picture
Здравствуйте, товарищи. Помогите разобраться с одной лотусной проблемой, возникшей на моем горизонте. Дело в том, что буквально на днях...

Обработчик событий и работа с объектами класса object
Всем суток времени доброго! Помогите начинающему дубу в следующие проблеме, если вас не затруднит. У меня есть обработчик события...

Работа с объектами класса: вывод на консоль, подсчет суммы
Здравствуйте, уважаемые программисты. Возникла проблема: 1) Не получается вывести на экран массив структур; 2) Как с помощью цикла...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru