繁体   English   中英

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

[英]Deserialize json array to c# list object

我正在尝试解析从服务到 c# 观察集合列表对象的 JSON 响应。 稍后可以使用列表对象在 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 页面中的相同对象作为列表重现。

提前致谢!

我确定该异常与您的 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);

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

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

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

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

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

在此代码中,您可以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"))

反序列化 json 到 List<object> 在 C#<div id="text_translate"><p> 我有以下 JSON 字符串</p><pre> { "data": [ { "symbol": "1COV.GE", "exposure": "0", "makerExposure": "-2028", "takerExposure": "2028", "makerPnl": "447.6688", "takerPnl": "-447.6688", "makerPositions": [ { "name": "IB_001", "position": "-2028", "vwap": "47.41", "pnl": "447.6688" } ], "takerPositions": [ { "name": "MT5_1", "position": "2028", "vwap": "47.41", "pnl": "-447.6688" } ] }, { "symbol": "A", "exposure": "0", "makerExposure": "-10", "takerExposure": "10", "makerPnl": "-4.6", "takerPnl": "4.6", "makerPositions": [ { "name": "IB_002", "position": "-10", "vwap": "136.78", "pnl": "-4.6" } ], "takerPositions": [ { "name": "MT5_1", "position": "10", "vwap": "136.78", "pnl": "4.6" } ], "total": 2 } }</pre><p> 我的目标是将它从节点“数据”序列化为 object 的列表:我有 map 数据节点字段的类:</p><pre> public class Positions { public string name { get; set; } public string position { get; set; } public string vwap { get; set; } public string pnl { get; set; } } public class ExPositions { public string symbol { get; set; } public string exposure { get; set; } public string makerExposure { get; set; } public string takerExposure { get; set; } public string makerPnl { get; set; } public string takerPnl { get; set; } public OZPositions makerPositions { get; set; } public OZPositions takerPositions { get; set; } }</pre><p> 您是否知道如何将节点“数据”转换为“Expositions”对象列表,例如。 列表</p><p>我已经这样做了,但到目前为止它会引发错误</p><pre>var positions = JsonSerializer.Deserialize<ExPositions>(json_string);</pre></div></object>

[英]Deserialize json to List<object> in C#

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 在C#中用牛顿反序列化json对象列表 C#将JSON反序列化为对象列表 C#反序列化对象错误的JSON列表 将列表的 JSON 字符串反序列化为 c# object 反序列化 json 到 List<object> 在 C#<div id="text_translate"><p> 我有以下 JSON 字符串</p><pre> { "data": [ { "symbol": "1COV.GE", "exposure": "0", "makerExposure": "-2028", "takerExposure": "2028", "makerPnl": "447.6688", "takerPnl": "-447.6688", "makerPositions": [ { "name": "IB_001", "position": "-2028", "vwap": "47.41", "pnl": "447.6688" } ], "takerPositions": [ { "name": "MT5_1", "position": "2028", "vwap": "47.41", "pnl": "-447.6688" } ] }, { "symbol": "A", "exposure": "0", "makerExposure": "-10", "takerExposure": "10", "makerPnl": "-4.6", "takerPnl": "4.6", "makerPositions": [ { "name": "IB_002", "position": "-10", "vwap": "136.78", "pnl": "-4.6" } ], "takerPositions": [ { "name": "MT5_1", "position": "10", "vwap": "136.78", "pnl": "4.6" } ], "total": 2 } }</pre><p> 我的目标是将它从节点“数据”序列化为 object 的列表:我有 map 数据节点字段的类:</p><pre> public class Positions { public string name { get; set; } public string position { get; set; } public string vwap { get; set; } public string pnl { get; set; } } public class ExPositions { public string symbol { get; set; } public string exposure { get; set; } public string makerExposure { get; set; } public string takerExposure { get; set; } public string makerPnl { get; set; } public string takerPnl { get; set; } public OZPositions makerPositions { get; set; } public OZPositions takerPositions { get; set; } }</pre><p> 您是否知道如何将节点“数据”转换为“Expositions”对象列表,例如。 列表</p><p>我已经这样做了,但到目前为止它会引发错误</p><pre>var positions = JsonSerializer.Deserialize<ExPositions>(json_string);</pre></div></object> 如何将json反序列化为C#列表对象 C#-反序列化JSON对象数组 JSON C#将具有1个项目的数组反序列化为对象 将未命名的json数组反序列化为c#中的对象 在Json对数组C#的响应中反序列化对象
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM