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

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

08.05.2019, 14:05. Просмотров 1740. Ответов 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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.05.2019, 14:05
Ответы с готовыми решениями:

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

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

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

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

6
Модератор
7167 / 5004 / 1440
Регистрация: 21.04.2018
Сообщений: 14,622
Записей в блоге: 2
08.05.2019, 14:28 2
Лучший ответ Сообщение было отмечено 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
Модератор
7167 / 5004 / 1440
Регистрация: 21.04.2018
Сообщений: 14,622
Записей в блоге: 2
08.05.2019, 14:30 3
Цитата Сообщение от 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  [ТС] 4
Цитата Сообщение от Элд Хасп Посмотреть сообщение
result - это у Вас список типизированный типом Tickets.
result - просто строка, для проверки и вывода на страницу. Типизированный список это - ticketlist. Подставил в ваш вариант ответа - все получилось, спасибо огромное!!! (неделю носил в себе прежде чем написать сюда)
0
Эксперт JS
4431 / 2479 / 1158
Регистрация: 14.06.2018
Сообщений: 4,978
08.05.2019, 14:39 5
Всем здравствуйте!
В данном случае можно всё упростить.
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  [ТС] 6
Цитата Сообщение от amr-now Посмотреть сообщение
В данном случае можно всё упростить.
Спасибо, нужно все это переварить)
0
Эксперт JS
4431 / 2479 / 1158
Регистрация: 14.06.2018
Сообщений: 4,978
08.05.2019, 15:29 7
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.05.2019, 15:29

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.