Как правильно десериализовать и получить значения от JSON - PullRequest
0 голосов
/ 23 января 2020

My json:

[
   {
      "id": "SUPER_TOTAL",
      "title": "All",
      "ticketSales": [
         {
            "dateStart": null,
            "dateFinish": null,
            "sum": 0,
            "quantity": 0,
            "sessions": 0,
            "rupart": 0,
            "moneyPerSession": 0,
            "ticketsPerSession": 0,
            "middlePrice": 0,
            "periodId": "SUPER_TOTAL"
         },
         {
            "dateStart": null,
            "dateFinish": null,
            "sum": 15355230,
            "quantity": 88943,
            "sessions": 13171,
            "rupart": 0,
            "moneyPerSession": 1165.84,
            "ticketsPerSession": 7,
            "middlePrice": 172.64,
            "periodId": "TOTAL"
         },
         {
            "dateStart": "2020.01.22T00:00:00",
            "dateFinish": "2020.01.23T00:00:00",
            "sum": 15355230,
            "quantity": 88943,
            "sessions": 13171,
            "rupart": 65.5,
            "moneyPerSession": 1165.84,
            "ticketsPerSession": 7,
            "middlePrice": 172.64,
            "periodId": "20200122"
         }
      ]
   },
   {
      "id": "TOTAL",
      "title": "Regions",
      "ticketSales": [
         {
            "dateStart": null,
            "dateFinish": null,
            "sum": 0,
            "quantity": 0,
            "sessions": 0,
            "rupart": 0,
            "moneyPerSession": 0,
            "ticketsPerSession": 0,
            "middlePrice": 0,
            "periodId": "SUPER_TOTAL"
         },
         {
            "dateStart": null,
            "dateFinish": null,
            "sum": 199057,
            "quantity": 1361,
            "sessions": 196,
            "rupart": 0,
            "moneyPerSession": 1015.6,
            "ticketsPerSession": 7,
            "middlePrice": 146.26,
            "periodId": "TOTAL"
         },
         {
            "dateStart": "2020.01.22T00:00:00",
            "dateFinish": "2020.01.23T00:00:00",
            "sum": 199057,
            "quantity": 1361,
            "sessions": 196,
            "rupart": 58.2,
            "moneyPerSession": 1015.6,
            "ticketsPerSession": 7,
            "middlePrice": 146.26,
            "periodId": "20200122"
         }
      ]
   },
   {
      "id": "2400000100000",
      "title": "City",
      "ticketSales": [
         {
            "dateStart": null,
            "dateFinish": null,
            "sum": 0,
            "quantity": 0,
            "sessions": 0,
            "rupart": 0,
            "moneyPerSession": 0,
            "ticketsPerSession": 0,
            "middlePrice": 0,
            "periodId": "SUPER_TOTAL"
         },
         {
            "dateStart": null,
            "dateFinish": null,
            "sum": 199057,
            "quantity": 1361,
            "sessions": 196,
            "rupart": 0,
            "moneyPerSession": 1015.6,
            "ticketsPerSession": 7,
            "middlePrice": 146.26,
            "periodId": "TOTAL"
         },
         {
            "dateStart": "2020.01.22T00:00:00",
            "dateFinish": "2020.01.23T00:00:00",
            "sum": 199057,
            "quantity": 1361,
            "sessions": 196,
            "rupart": 58.2,
            "moneyPerSession": 1015.6,
            "ticketsPerSession": 7,
            "middlePrice": 146.26,
            "periodId": "20200122"
         }
      ]
   }
]

Сгенерированные классы:

public class TicketSale
{
    public string dateStart { get; set; }
    public string dateFinish { get; set; }
    public int sum { get; set; }
    public int quantity { get; set; }
    public int sessions { get; set; }
    public double rupart { get; set; }
    public double moneyPerSession { get; set; }
    public int ticketsPerSession { get; set; }
    public double middlePrice { get; set; }
    public string periodId { get; set; }
}

public class RootObject
{
    public string id { get; set; }
    public string title { get; set; }
    public List<TicketSale> ticketSales { get; set; }
}

Мне нужно получить значения суммы, количества, сессий от каждого из ticketSales, но только во втором и третьи объекты в массиве, а не первые, потому что он всегда имеет нулевые значения. Таким образом, класс TicketSale будет:

public class TicketSale
{
    public int sum { get; set; }
    public int quantity { get; set; }
    public int sessions { get; set; }
}

Таким образом, это будет два x три = шесть класса TicketSales со значениями. Я использую Newtonsoft. Json.

Ответы [ 2 ]

0 голосов
/ 23 января 2020

Итак, пожалуйста, используйте Json. Net. Это самый простой способ. https://www.newtonsoft.com/json/help/html/DeserializeObject.htm

Вот пример:

var json = "[\r\n   {\r\n      \"id\": \"SUPER_TOTAL\",\r\n      \"title\": \"All\",\r\n      \"ticketSales\": [\r\n         {\r\n            \"dateStart\": null,\r\n            \"dateFinish\": null,\r\n            \"sum\": 0,\r\n            \"quantity\": 0,\r\n            \"sessions\": 0,\r\n            \"rupart\": 0,\r\n            \"moneyPerSession\": 0,\r\n            \"ticketsPerSession\": 0,\r\n            \"middlePrice\": 0,\r\n            \"periodId\": \"SUPER_TOTAL\"\r\n         },\r\n         {\r\n            \"dateStart\": null,\r\n            \"dateFinish\": null,\r\n            \"sum\": 15355230,\r\n            \"quantity\": 88943,\r\n            \"sessions\": 13171,\r\n            \"rupart\": 0,\r\n            \"moneyPerSession\": 1165.84,\r\n            \"ticketsPerSession\": 7,\r\n            \"middlePrice\": 172.64,\r\n            \"periodId\": \"TOTAL\"\r\n         },\r\n         {\r\n            \"dateStart\": \"2020.01.22T00:00:00\",\r\n            \"dateFinish\": \"2020.01.23T00:00:00\",\r\n            \"sum\": 15355230,\r\n            \"quantity\": 88943,\r\n            \"sessions\": 13171,\r\n            \"rupart\": 65.5,\r\n            \"moneyPerSession\": 1165.84,\r\n            \"ticketsPerSession\": 7,\r\n            \"middlePrice\": 172.64,\r\n            \"periodId\": \"20200122\"\r\n         }\r\n      ]\r\n   },\r\n   {\r\n      \"id\": \"TOTAL\",\r\n      \"title\": \"Regions\",\r\n      \"ticketSales\": [\r\n         {\r\n            \"dateStart\": null,\r\n            \"dateFinish\": null,\r\n            \"sum\": 0,\r\n            \"quantity\": 0,\r\n            \"sessions\": 0,\r\n            \"rupart\": 0,\r\n            \"moneyPerSession\": 0,\r\n            \"ticketsPerSession\": 0,\r\n            \"middlePrice\": 0,\r\n            \"periodId\": \"SUPER_TOTAL\"\r\n         },\r\n         {\r\n            \"dateStart\": null,\r\n            \"dateFinish\": null,\r\n            \"sum\": 199057,\r\n            \"quantity\": 1361,\r\n            \"sessions\": 196,\r\n            \"rupart\": 0,\r\n            \"moneyPerSession\": 1015.6,\r\n            \"ticketsPerSession\": 7,\r\n            \"middlePrice\": 146.26,\r\n            \"periodId\": \"TOTAL\"\r\n         },\r\n         {\r\n            \"dateStart\": \"2020.01.22T00:00:00\",\r\n            \"dateFinish\": \"2020.01.23T00:00:00\",\r\n            \"sum\": 199057,\r\n            \"quantity\": 1361,\r\n            \"sessions\": 196,\r\n            \"rupart\": 58.2,\r\n            \"moneyPerSession\": 1015.6,\r\n            \"ticketsPerSession\": 7,\r\n            \"middlePrice\": 146.26,\r\n            \"periodId\": \"20200122\"\r\n         }\r\n      ]\r\n   },\r\n   {\r\n      \"id\": \"2400000100000\",\r\n      \"title\": \"City\",\r\n      \"ticketSales\": [\r\n         {\r\n            \"dateStart\": null,\r\n            \"dateFinish\": null,\r\n            \"sum\": 0,\r\n            \"quantity\": 0,\r\n            \"sessions\": 0,\r\n            \"rupart\": 0,\r\n            \"moneyPerSession\": 0,\r\n            \"ticketsPerSession\": 0,\r\n            \"middlePrice\": 0,\r\n            \"periodId\": \"SUPER_TOTAL\"\r\n         },\r\n         {\r\n            \"dateStart\": null,\r\n            \"dateFinish\": null,\r\n            \"sum\": 199057,\r\n            \"quantity\": 1361,\r\n            \"sessions\": 196,\r\n            \"rupart\": 0,\r\n            \"moneyPerSession\": 1015.6,\r\n            \"ticketsPerSession\": 7,\r\n            \"middlePrice\": 146.26,\r\n            \"periodId\": \"TOTAL\"\r\n         },\r\n         {\r\n            \"dateStart\": \"2020.01.22T00:00:00\",\r\n            \"dateFinish\": \"2020.01.23T00:00:00\",\r\n            \"sum\": 199057,\r\n            \"quantity\": 1361,\r\n            \"sessions\": 196,\r\n            \"rupart\": 58.2,\r\n            \"moneyPerSession\": 1015.6,\r\n            \"ticketsPerSession\": 7,\r\n            \"middlePrice\": 146.26,\r\n            \"periodId\": \"20200122\"\r\n         }\r\n      ]\r\n   }\r\n]";

RootObject[] root = JsonConvert.DeserializeObject<RootObject[]>(json);

foreach(var rootItem in root)
{
    rootItem.ticketSales.RemoveAt(0);
}

"json" является переменной с json строка

Для удаления первых элементов Вы можете использовать RemoveAt (0)

0 голосов
/ 23 января 2020

Мне нужно получить значения суммы, количества, сессий от каждого из ticketSales, но только во втором и третьем объектах в массиве, а не в первом

Если вам нужен TicketSales, но не первый элемент, вы можете сделать это с помощью запроса Linq с оператором Skip (1).

Ответ, который вы ищете

    var main = JsonConvert.DeserializeObject<List<RootObject>>(json);
    var ticketSales = main.Select(x => x.ticketSales.Skip(1)).ToList();

main is your full json документ преобразован, а ticketSales - это массив всех ticketSales для каждого элемента вашего массива. Если вы хотите собрать все продажи билетов в одном списке (вместо трех), вы можете использовать SelectMany

    var ticketSales = main.Select(x => x.ticketSales.Skip(1)).SelectMany(x => x).ToList();

SelectMany поместит все продажи билетов в один список.

Кроме того

Если вы заинтересованы в 1 элементе TicketSale с суммой всех TicketSales, вы можете создать новый объект на основе указанной выше переменной ticketSales.

    TicketSale allSalesCollective = new TicketSale() 
    { 
        sum = ticketSales.Sum(x => x.sum), 
        quantity = ticketSales.Sum(x => x.quantity),
        sessions = ticketSales.Sum(x => x.sessions) 
    };

This выдаст вам TicketSale с суммой, количеством и количеством сеансов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...