将 JSON 反序列化为 C# Class
Deserializing JSON to C# Class
我调用 API returns JSON 数据如下(数组有大约 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(结果).
解析此数据
我尝试过的两次尝试(见下文)都产生了以下错误:
错误信息
无法将当前 JSON 数组(例如 [1,2,3])反序列化为类型 '...+CandleSticks',因为该类型需要一个 JSON 对象(例如 {"name ":"value"}) 正确反序列化。
要修复此错误,请将 JSON 更改为 JSON 对象(例如 {"name":"value"})或将反序列化类型更改为数组或实现的类型一个集合接口(例如 ICollection、IList),例如可以从 JSON 数组反序列化的 List。
JsonArrayAttribute 也可以添加到类型以强制它从 JSON 数组反序列化。
路径 '',第 1 行,位置 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]
,但对于您真正想要的长整数和整数使用 Convert
,因为小的整数值可能会变成整数,而较大的值可能会变成长整数,然后你不能简单地转换。
我调用 API returns JSON 数据如下(数组有大约 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(结果).
解析此数据我尝试过的两次尝试(见下文)都产生了以下错误:
错误信息
无法将当前 JSON 数组(例如 [1,2,3])反序列化为类型 '...+CandleSticks',因为该类型需要一个 JSON 对象(例如 {"name ":"value"}) 正确反序列化。
要修复此错误,请将 JSON 更改为 JSON 对象(例如 {"name":"value"})或将反序列化类型更改为数组或实现的类型一个集合接口(例如 ICollection、IList),例如可以从 JSON 数组反序列化的 List。 JsonArrayAttribute 也可以添加到类型以强制它从 JSON 数组反序列化。 路径 '',第 1 行,位置 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]
,但对于您真正想要的长整数和整数使用 Convert
,因为小的整数值可能会变成整数,而较大的值可能会变成长整数,然后你不能简单地转换。