我正在尝试解析这个json数组:https://min-api.cryptocompare.com/data/histominute?fsym=BTC&tsym=USD&limit=60&aggregate=3&e=Kraken
Idea会为每个时间戳读取一些值(并非所有时间戳)。我怎么能得到第一个时间戳,关闭,高,低,开放的数据?
我已经尝试了几种用于简单json叮咬的方法,但这对我来说似乎是挑战,无法以任何方式读取数据。
首先,我创建了单独的类文件:
namespace HistoryData
{
class DataQuery
{
public string Data { get; set; }
public string Time { get; set; }
public string Close { get; set; }
public string High { get; set; }
public string Low { get; set; }
public string Open { get; set; }
public string Volumefrom { get; set; }
public string Volumeto { get; set; }
}
}
然后解析:
const string url = @"https://min-api.cryptocompare.com/data/histominute?
fsym=BTC&tsym=USD&limit=30&aggregate=3&e=Kraken";
var client = new WebClient();
var content = client.DownloadString(url);
var results = JsonConvert.DeserializeObject<List<DataQuery>>(content);
var Time1 = (results[1].Time);
var Close1 = (results[1].Close);
不工作
如果使用https://jsonformatter.curiousconcept.com/格式化JSON,您将看到最外面的容器是一个对象,而不是一个数组:
{
"Response":"Success",
"Type":100,
"Aggregated":true,
"Data": [/*...*/],
"TimeTo":1513705980,
"TimeFrom":1513695060,
"FirstValueInArray":true,
"ConversionType":{
"type":"force_direct",
"conversionSymbol":""
}
}
因此,您需要反序列化为反映此JSON结构的适当根数据模型。你的DataQuery
只反映嵌套的"Data"
物体。您可以使用http://json2csharp.com/或Paste JSON as Classes为您设计该模型:
public class Datum
{
public long time { get; set; }
public decimal close { get; set; }
public decimal high { get; set; }
public decimal low { get; set; }
public decimal open { get; set; }
public double volumefrom { get; set; }
public double volumeto { get; set; }
}
public class ConversionType
{
public string type { get; set; }
public string conversionSymbol { get; set; }
}
public class RootObject
{
public string Response { get; set; }
public int Type { get; set; }
public bool Aggregated { get; set; }
public List<Datum> Data { get; set; }
public long TimeTo { get; set; }
public long TimeFrom { get; set; }
public bool FirstValueInArray { get; set; }
public ConversionType ConversionType { get; set; }
}
并反序列化:
var root = JsonConvert.DeserializeObject<RootObject>(content);
var results = root.Data;
var Time1 = (results[1].time);
var Close1 = (results[1].close);
笔记:
close
,high
,low
和open
看起来是货币价值,我将他们的类型修改为decimal
。long
。工作.Net fiddle。