将json数组反序列化为c#list对象

时间:2018-05-15 05:40:39

标签: c# rest xaml xamarin.forms json.net

我正在尝试将服务中的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数组反序列化进行一些更改后,我无法成功。现在有一个例外

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

我被困在这一段很长一段时间,在StackOverflow上搜索并搜索了它,但没有找到有效的解决方案。

我需要将JSON数据存储到c#对象中,并在列表中重现XAML页面中的同一对象。

提前致谢!

5 个答案:

答案 0 :(得分:4)

我确信异常与您的JSON字符串无关,但尝试从解决方案文件夹中删除binobj,然后清理并重建解决方案。

但在解决之后你会得到以下异常

  

无法将当前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);

答案 1 :(得分:0)

您正在反序列化订单列表,因此您应该反序列化:

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

答案 2 :(得分:0)

您的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);
}

答案 3 :(得分:0)

试试这个自动生成的代码:

// 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

答案 4 :(得分:0)

在此代码中,您可以DeserializeObject json文件:

 using (StreamReader r = new StreamReader("D:/Source/ParsijooWeatherApi/ParsijooWeatherApi/cities2.json"))
        {
            string json = r.ReadToEnd();
            List<jsonVariables> items = JsonConvert.DeserializeObject<List<jsonVariables>>(json);

            dynamic array = JsonConvert.DeserializeObject(json);
            foreach (var item in array)
            {
                Console.WriteLine("{0} {1}", item.latitude, item.longitude);
            }
        }

jsonVariables类是:

public class jsonVariables
{
    [JsonProperty("latitude")]
    public string latitude { get; set; }

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

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

在此代码中,您可以访问根目录项目:

 string _filePath = Path.GetDirectoryName(System.AppDomain.CurrentDomain.BaseDirectory);

然后:

StreamReader r = new StreamReader(_filePath + "/cities2.json"))