我试图解析这个json数组: https://min-api.cryptocompare.com/data/histominute?fsym=BTC&tsym=USD&limit=60&aggregate=3&e=Kraken
为每个时间戳读取一些值(不是全部需要)。 我怎么能得到第一个时间戳,关闭,高,低,开放的数据?
我尝试了几种用于简单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);
不工作
答案 0 :(得分:0)
如果使用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。