Десериализовать массив json в объект списка c # - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь проанализировать ответ JSON от службы на объект списка сбора данных наблюдения c #.Позже объект списка можно использовать для демонстрации на странице XAML.

Вот ответ службы:

[
  {
    "orderId": 1,
    "employeeId": "6364",
    "orderTime": 1517583600000,
    "orderCost": 90,
    "comments": null,
    "orderStatus": {
      "orderStatusId": 1,
      "orderStatusName": "Order Placed"
    },
    "orderedItems": [
      {
        "orderItemId": 1,
        "orderQuantity": 1,
        "orderItemCost": 50
      },
      {
        "orderItemId": 2,
        "orderQuantity": 1,
        "orderItemCost": 40
      }
    ]
  },
  {
    "orderId": 2,
    "employeeId": "6364",
    "orderTime": 1517670000000,
    "orderCost": 50,
    "comments": null,
    "orderStatus": {
      "orderStatusId": 3,
      "orderStatusName": "Order Delivered"
    },
    "orderedItems": [
      {
        "orderItemId": 3,
        "orderQuantity": 1,
        "orderItemCost": 50
      }
    ]
  }
]

Ниже приведен класс модели:

namespace ServiceNew
{

    public class OrderStatus
    {
        public int orderStatusId { get; set; }
        public string orderStatusName { get; set; }
    }

    public class OrderedItem
    {
        [JsonProperty("orderItemId")]
        public int orderItemId { get; set; }

        [JsonProperty("orderQuantity")]
        public int orderQuantity { get; set; }

        [JsonProperty("orderItemCost")]
        public int orderItemCost { get; set; }
    }

    public class Order
    {
        [JsonProperty("orderId")]
        public int orderId { get; set; }

        [JsonProperty("employeeId")]
        public string employeeId { get; set; }

        [JsonProperty("orderTime")]
        public object orderTime { get; set; }
        [JsonProperty("orderCost")]
        public int orderCost { get; set; }

        [JsonProperty("comments")]
        public object comments { get; set; }

        [JsonProperty("orderStatus")]
        public OrderStatus orderStatus { get; set; }

        [JsonProperty("orderedItems")]
        public List<OrderedItem> orderedItems { get; set; }
    }


}

Служба выглядит следующим образом:

public  class OrderService
    {
        public OrderService()
        {
            GetJson();
        }
        public async void GetJson()
        {
            if (NetworkCheck.IsInternet())
            {
                var client = new System.Net.Http.HttpClient();
                var response = await client.GetAsync("here is thre URL");
                string orderJson = await response.Content.ReadAsStringAsync(); //Getting response  

                Order ObjOrderList = new Order();
                if (orderJson != " ")
                {

                    Console.WriteLine("response is"+orderJson);

                   //exception occurs here all the time , and I need it to be a list
                    ObjOrderList = JsonConvert.DeserializeObject<Order>(orderJson);
                }

                Console.WriteLine("obj order list is"+ObjOrderList);
            }
        }
    }

После попытки внесения некоторых изменений в десериализацию массива JSON в c # я не смог добиться успеха.Теперь есть исключение, говорящее

Newtonsoft.Json.JsonSerializationException: <Timeout exceeded getting exception details>

И я застрял в этом в течение долгого времени, искал по StackOverflow и погуглил его, но никакого плодотворного решения для этого нет.

Мне нужно сохранитьДанные JSON в объект ac # и воспроизводят тот же объект на странице XAML, что и список.

Заранее спасибо!

Ответы [ 4 ]

0 голосов
/ 15 мая 2018

Попробуйте этот автоматически сгенерированный код:

// To parse this JSON data, add NuGet 'Newtonsoft.Json' then do:
//
//    using yourNameSpace;
//
//    var orderResponse = OrderResponse.FromJson(jsonString);

namespace yourNameSpace
{
    using System;
    using System.Collections.Generic;

    using System.Globalization;
    using Newtonsoft.Json;
    using Newtonsoft.Json.Converters;

public partial class OrderResponse
{
    [JsonProperty("orderId")]
    public long OrderId { get; set; }

    [JsonProperty("employeeId")]
    public string EmployeeId { get; set; }

    [JsonProperty("orderTime")]
    public long OrderTime { get; set; }

    [JsonProperty("orderCost")]
    public long OrderCost { get; set; }

    [JsonProperty("comments")]
    public object Comments { get; set; }

    [JsonProperty("orderStatus")]
    public OrderStatus OrderStatus { get; set; }

    [JsonProperty("orderedItems")]
    public List<OrderedItem> OrderedItems { get; set; }
}

public partial class OrderStatus
{
    [JsonProperty("orderStatusId")]
    public long OrderStatusId { get; set; }

    [JsonProperty("orderStatusName")]
    public string OrderStatusName { get; set; }
}

public partial class OrderedItem
{
    [JsonProperty("orderItemId")]
    public long OrderItemId { get; set; }

    [JsonProperty("orderQuantity")]
    public long OrderQuantity { get; set; }

    [JsonProperty("orderItemCost")]
    public long OrderItemCost { get; set; }
}

public partial class OrderResponse
{
    public static List<OrderResponse> FromJson(string json) => JsonConvert.DeserializeObject<List<OrderResponse>>(json);
}

код был сгенерирован с использованием QuickType.io Я отказался от конвертера и некоторых других дополнительных классов. Вы можете изменить тип Long на int, если хотите.

Чтобы использовать это просто позвоните

var orderResponse = OrderResponse.FromJson(jsonString);

передать ответ вместо jsonString

0 голосов
/ 15 мая 2018

Я уверен, что исключение не связано с вашей строкой JSON, но попробуйте удалить bin и obj из папки решения, а затем очистить и перестроить решение.

но после решения, что вы получите следующее исключение

Невозможно десериализовать текущий массив JSON (например, [1,2,3]) в тип 'namespace.Order', потому что типу требуется объект JSON (например, {"name": "value"}) для правильной десериализации. ...

Поскольку вашей строкой JSON является Список Order, десериализация будет изменена на:

List<Order> ObjOrderList = JsonConvert.DeserializeObject<List<Order>>(orderJson);

или на другой стороне вы также можете использовать JavaScriptSerializer, например:

Order[] orderList = new JavaScriptSerializer().Deserialize<Order[]>(orderJson);
0 голосов
/ 15 мая 2018

Ваш JSON начинается с [ и заканчивается ].Это означает, что ваш JSON представляет массив объектов.Эти объекты:

Первый объект

{
    "orderId": 1,
    "employeeId": "6364",
    "orderTime": 1517583600000,
    "orderCost": 90,
    ...
}

Второй объект

{
    "orderId": 2,
    "employeeId": "6364",
    "orderTime": 1517670000000,
    "orderCost": 50,
    ...
}

В вашем подсознании вы знали этофактически имя вашей десериализованной переменной - ObjOrderList (выделение List).

Итак, просто десериализовать в массив / список Order.

Примерсо списком

var ObjOrderList = new List<Order>();
if (orderJson != " ")
{
    //exception occurs here all the time , and I need it to be a list
    ObjOrderList = JsonConvert.DeserializeObject<List<Order>>(orderJson);
}

Пример с массивом

var ObjOrderList = new Order[] { };
if (orderJson != " ")
{
    //exception occurs here all the time , and I need it to be a list
    ObjOrderList = JsonConvert.DeserializeObject<Order[]>(orderJson);
}
0 голосов
/ 15 мая 2018

Вы десериализуете список заказов, поэтому вы должны десериализовать так:

...
List<Order> ObjOrderList;
...
ObjOrderList = JsonConvert.DeserializeObject<List<Order>>(orderJson);
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...