C#解析json数组和选择值

时间:2017-12-19 11:49:47

标签: c# json

我试图解析这个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);

不工作

1 个答案:

答案 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);

注意:

  • 由于closehighlowopen看起来是货币值,我将其类型修改为decimal

  • 为了安全起见,我还将时间戳更改为long

工作.Net fiddle