C#解析json数组和选择值

问题描述 投票:-1回答:1

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

不工作

c# json
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.