C#使用newtonsoft json.net将json数组转换为对象列表

时间:2017-07-30 02:31:20

标签: c# json.net

我找到了similar problems,但在我的案例中似乎没有任何解决方案。

我的json看起来像这样:

{"array": [
    {"order_id": 4923887462, "type_id": 19297, "location_id": 60008494, "volume_total": 1, "volume_remain": 1, "min_volume": 1, "price": 130000000.0, "is_buy_order": false, "duration": 90, "issued": "2017-07-25T16:40:18Z", "range": "region"}, 
    {"order_id": 4926414947, "type_id": 19297, "location_id": 60008494, "volume_total": 1, "volume_remain": 1, "min_volume": 1, "price": 92000000.0, "is_buy_order": false, "duration": 90, "issued": "2017-07-29T06:47:29Z", "range": "region"}, 
    {"order_id": 4927013184, "type_id": 19297, "location_id": 60008494, "volume_total": 1, "volume_remain": 1, "min_volume": 1, "price": 91999989.82, "is_buy_order": false, "duration": 90, "issued": "2017-07-29T22:26:05Z", "range": "region"}, 
    {"order_id": 4927082974, "type_id": 19297, "location_id": 60008494, "volume_total": 2, "volume_remain": 2, "min_volume": 1, "price": 91999989.81, "is_buy_order": false, "duration": 90, "issued": "2017-07-30T00:22:36Z", "range": "region"}
]}

我的处理代码的相关部分如下所示:

using System;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Collections.Generic;

namespace sqlite_test
{
  public class Program
  {
    public static void Main()
    {
      int item = 19297;

      string json = ESIHelper.MarketFetch.getMarketData((int)ESIHelper.Regions.Domain,item,"sell",1).Result;
      ESIHelper.Models.MarketOrderList obj = JsonConvert.DeserializeObject<ESIHelper.Models.MarketOrderList>(json);
    }
  }
}

using System.Collections.Generic;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace ESIHelper.Models
{
  public class MarketOrder
  {
    [Newtonsoft.Json.JsonProperty(PropertyName = "duration")]
    public int duration { get; set; }
    [Newtonsoft.Json.JsonProperty(PropertyName = "is_buy_order")]
    public bool is_buy_order { get; set; }
    [Newtonsoft.Json.JsonProperty(PropertyName = "issued")]
    public string issued { get; set; }
    [Newtonsoft.Json.JsonProperty(PropertyName = "location_id")]
    public int location_id { get; set; }
    [Newtonsoft.Json.JsonProperty(PropertyName = "min_volume")]
    public int min_volume { get; set; }
    [Newtonsoft.Json.JsonProperty(PropertyName = "order_id")]
    public int order_id { get; set; }
    [Newtonsoft.Json.JsonProperty(PropertyName = "price")]
    public double price { get; set; }
    [Newtonsoft.Json.JsonProperty(PropertyName = "range")]
    public string range { get; set; }
    [Newtonsoft.Json.JsonProperty(PropertyName = "type_id")]
    public int type_id { get; set; }
    [Newtonsoft.Json.JsonProperty(PropertyName = "volume_remain")]
    public int volume_remain { get; set; }
    [Newtonsoft.Json.JsonProperty(PropertyName = "volume_total")]
    public int volume_total { get; set; }
  }

  public class MarketOrderList
  {
    public List<MarketOrder> MarketOrder { get; set; }
  }
}

在内存中,我的json字符串在json中按预期显示,但obj为空。

我使用.NET核心1.1和Newtonsoft Json.net 10.0.3。

1 个答案:

答案 0 :(得分:1)

您正在获取一个空对象,因为您没有向[JsonProperty]类中的MarketOrder属性添加MarketOrderList属性,并且属性名称与JSON中的属性名称不匹配。它应该是这样的:

public class MarketOrderList
{
    [JsonProperty(PropertyName = "array")]
    public List<MarketOrder> MarketOrder { get; set; }
}

但是你有另一个问题。 JSON中的order_id值太大,无法容纳int。您需要将order_id类中MarketOrder属性的声明更改为long才能使其生效。

public class MarketOrder
{
    ...

    [JsonProperty(PropertyName = "order_id")]
    public long order_id { get; set; }

    ...
}

通过这两项更改,它会反序列化。

小提琴:https://dotnetfiddle.net/TcAfAq