将JSON字符串转换为C#对象

时间:2019-07-03 07:11:44

标签: c# json

我试图将JSON字符串反序列化为对象,但遇到了一个异常,真的很困惑。

"{

\"lastUpdateId\":787618462,
\"bids\":[[\"10451.90000000\",\"0.18884000\"],[\"10451.70000000\",\"0.01770200\"]],

\"asks\":[[\"10457.88000000\",\"0.17060500\"],[\"10458.13000000\",\"0.79300000\"]]

}"

这是必需的对象:

 public class OrderBook
    {
        [JsonProperty("lastUpdateId")]
        public int lastUpdateId { get; set; }

        [JsonProperty("asks")]
        public List<OrderBookOrder> Asks { get; set; }

        [JsonProperty("bids")]
        public List<OrderBookOrder> Bids { get; set; }

        public OrderBook(List<OrderBookOrder> asks, List<OrderBookOrder> bids)
        {
            Asks = asks;
            Bids = bids;
        }
        public OrderBook()
        {

        }
    }

    public class OrderBookOrder
    {
        public decimal Price { get; set; }
        public decimal Volume { get; set; }

        public OrderBookOrder(decimal price, decimal volume)
        {
            Price = price;
            Volume = volume;
        }
    }

所以然后我使用NewtonSoft Json将字符串转换为对象

 public static implicit operator OrderBook(ApiResponse response)
        {
            return Utilities.ConverFromJason<OrderBook>(response);
        }

我认为问题是将两个数组(出价和要价)相减,但不能解决问题。非常感谢您的帮助!

4 个答案:

答案 0 :(得分:3)

您提供的JSON必须具有所示的类结构

public class RootObject
{
    public int lastUpdateId { get; set; }
    public List<List<string>> bids { get; set; }
    public List<List<string>> asks { get; set; }
}

答案 1 :(得分:1)

最好的选择是使用Newtonsoft.Json(来自nuget)。您所要做的就是:

OrderBook ob = JsonConvert.DeserializeObject<OrderBook>(response.ToString());

您的模型必须是这样的:

public class OrderBook
{
    [JsonProperty("lastUpdateId")]
    public int lastUpdateId { get; set; }
    [JsonProperty("bids")]
    public List<List<string>> bids { get; set; }
    [JsonProperty("asks")]
    public List<List<string>> asks { get; set; }
}

您可以在此处从json字符串中获取合适的模型:http://json2csharp.com/

重要!您的所有Json属性必须具有公共getter和setter。即使您只序列化或反序列化。

要填充OrderBookOrder对象,必须创建一个特定的方法并在反序列化后调用它。使用Newtonsoft.Json无法将JSon模型转换为其他模型。

答案 2 :(得分:0)

根据您的问题,您的模型类如下所示

public class OrderBook
{

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

    [JsonProperty("bids")]
    public IList<IList<string>> Bids { get; set; }

    [JsonProperty("asks")]
    public IList<IList<string>> Asks { get; set; }
}

有效的json格式如下所示

{
"lastUpdateId": 787618462,
"bids": [
    [".90000000 ", "0.18884000 "],
    ["10451.70000000 ", "0.01770200 "]
],
"asks": [
    ["10457.88000000", "0.17060500"],
    ["10458.13000000", "0.79300000"]
]
}

您可以编写DeserializeObject代码

public static implicit operator OrderBook(ApiResponse response)
        {
            return JsonConvert.DeserializeObject<OrderBook>(response);
        }

答案 3 :(得分:0)

如果您不想使用属性来污染模型,也可以使用Fluent-JSON.NET。