繁体   English   中英

将 JSON 反序列化为 C# Class

[英]Deserializing JSON to C# Class

我正在调用返回 JSON 数据的 API 数据如下(该数组大约有 500 个项目):

[
    [
        1571702400000,
        "8197.28000000",
        "8297.99000000",
        "8000.00000000",
        "8020.00000000",
        "34651.82866300",
        1571788799999,
        "283535483.41051363",
        384699,
        "16767.03682400",
        "137253195.95826291",
        "0"
    ],
    [
        1614816000000,
        "50349.37000000",
        "51773.88000000",
        "49010.10000000",
        "49653.85000000",
        "25551.11905400",
        1614902399999,
        "1280981565.05072601",
        731056,
        "12197.45497900",
        "611820740.21554123",
        "0"
    ]
]

我正在尝试使用JsonConvert.DeserializeObject(result)解析这些数据。

我尝试过的两次尝试(见下文)都会产生以下错误:

错误信息

无法将当前的 JSON 数组(例如 [1,2,3])反序列化为类型“...+CandleSticks”,因为该类型需要 JSON ZA8CFDE6331BD59EB2AC96F8911BD59EB2AC96F8911C4B2AC96F8911C4B2AC96F8911C4B666

要修复此错误,请将 JSON 更改为 JSON object (例如 {"name":"value"})或将实现的反序列化类型接口更改为数组或集合从 JSON 阵列反序列化。 JsonArrayAttribute 也可以添加到类型中以强制它从 JSON 数组反序列化。 路径 '',第 1 行,position 1。

尝试#1:

public class CandleStick
{
    public List<List<object>> MyArray { get; set; } 
}
...
CandleStick myCandles = JsonConvert.DeserializeObject<CandleStick>(result);

尝试#2:

public class CandleStick
{
    public long openTime { get; set; }
    public string open { get; set; }
    public string high { get; set; }
    public string low { get; set; }
    public string close { get; set; }
    public string volume { get; set; }
    public long closeTime { get; set; }
    public string quoteAssetVolume { get; set; }
    public int numberOfTrades { get; set; }
    public string takerBuyBaseAssetVolume { get; set; }
    public string takerBuyQuoteAssetVolume { get; set; }
    public string ignore { get; set; }
}
...
List<CandleStick> myCandles = (List<CandleStick>)JsonConvert.DeserializeObject(result, typeof(List<CandleStick>));

我应该如何将 JSON 数据正确解析为 C# class?

编辑 - 更新

我现在可以反序列化“无用” JSON 如下:

var arrays = JsonConvert.DeserializeObject<List<List<object>>>(result);
            IEnumerable<CandleStick> candles = from values in arrays
                               select new CandleStick
                               {
                                   openTime = Convert.ToInt64(values[0]),
                                   open = Convert.ToString(values[1]),
                                   high = Convert.ToString(values[2]),
                                   low = Convert.ToString(values[3]),
                                   close = Convert.ToString(values[4]),
                                   volume = Convert.ToString(values[5]),
                                   closeTime = Convert.ToInt64(values[6]),
                                   quoteAssetVolume = Convert.ToString(values[7]),
                                   numberOfTrades = Convert.ToInt32(values[8]),
                                   takerBuyBaseAssetVolume = Convert.ToString(values[9]),
                                   takerBuyQuoteAssetVolume = Convert.ToString(values[10]),
                                   ignore = Convert.ToString(values[11])
                               };

CandleStick cd = candles.ElementAt(0);

当我尝试引用蜡烛的元素时,我收到一条错误消息,指出预期的字符串格式不正确。

傻我。 如果我更仔细地考虑它,错误消息是有道理的。 我的数组没有正确转换其中一个元素。 现在我可以按预期引用数据 - ElementAt(x),ToList()。 等等

你的第 1 次尝试就快到了。

你可以做:

var arrays = JsonConvert.DeserializeObject<List<List<object>>>(json);

但是你必须自己做映射:

var candlesticks =
    from values in arrays
    select new CandleSticks
    {
        openTime = Convert.ToInt64(values[0]),
        open = Convert.ToString(values[1]),
        high = Convert.ToString(values[2]),
        ...
    };

我知道大多数值已经采用正确的格式,所以至少对于字符串,你可能可以通过一个案例来解决,比如high = (string)values[2] ,但是对于你真正想要的 long 和 ints使用Convert ,因为小的 integer 值可能会变成整数,而更高的值可能会变成长整数,然后你不能简单地转换。

暂无
暂无

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM