簡體   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