我正在尝试将JSON数据保存到我的类中。我尝试了不同的方法,但没有成功。 这是我的班级:
class YoCurrency
{
public string Currency { get; set; }
public double high { get; set; }
public double low { get; set; }
public double avg { get; set; }
public double vol { get; set; }
[JsonProperty("vol_cur")]
public double vol_cur { get; set; }
public double last { get; set; }
public double buy { get; set; }
public double sell { get; set; }
public int updated { get; set; }
}
这是JSON file.
尝试使用通用List反序列化:
List<YoCurrency> a = JsonConvert.DeserializeObject<List<YoCurrency>>(json);
给出错误:
Newtonsoft.Json.JsonSerializationException:'无法将当前JSON对象(例如{“name”:“value”})反序列化为类型'System.Collections.Generic.List`1 [YoBitParser.YobitCurrency]',因为类型需要一个JSON数组(例如[1,2,3])正确反序列化。 要修复此错误,请将JSON更改为JSON数组(例如[1,2,3])或更改反序列化类型,使其成为普通的.NET类型(例如,不是像整数这样的基本类型,而不是类似的集合类型可以从JSON对象反序列化的数组或List。 JsonObjectAttribute也可以添加到类型中以强制它从JSON对象反序列化。 路径'btc_usd',第1行,第11位。'
以这种方式反序列化:
var a = JsonConvert.DeserializeObject<YobitCurrency>(json);
不提供任何结果,因为所有类字段都获得0值
我还尝试使用这样的两个类:
class YoCurrency
{
public double high { get; set; }
public double low { get; set; }
public double avg { get; set; }
public double vol { get; set; }
[JsonProperty("vol_cur")]
public double vol_cur { get; set; }
public double last { get; set; }
public double buy { get; set; }
public double sell { get; set; }
public int updated { get; set; }
}
class YoPair
{
YoCurrency Currency { get; set; }
string Name { get; set; }
}
但它没有给出任何积极的结果。我尝试使用http://json2csharp.com生成c#类,但它为每种货币生成一个类:
public class BtcUsd
{
public double high { get; set; }
public double low { get; set; }
public double avg { get; set; }
public double vol { get; set; }
public double vol_cur { get; set; }
public double last { get; set; }
public double buy { get; set; }
public double sell { get; set; }
public int updated { get; set; }
}
public class EthUsd
{
...
}
public class RootObject
{
public BtcUsd btc_usd { get; set; }
public EthUsd eth_usd { get; set; }
...
}
但我认为,对于50或500双(或者我是否应该为每种货币创建一个独特的类?)它不是好方法?
所以请帮我反序列化这个JSON,或者给我一些可以帮助我解决这个问题的信息。
答案 0 :(得分:1)
为什么不做一个课?
class Program
{
static void Main(string[] args)
{
var array = "[{\"btc_usd\":[{\"high\":8550.0102,\"low\":7800,\"avg\":8175.0051,\"vol\":1615543.57397705,\"vol_cur\":197.54076079,\"last\":7850,\"buy\":7850.00000000,\"sell\":7879.00000000,\"updated\":1521383863}],\"eth_usd\":[{\"high\":622.93708559,\"low\":482,\"avg\":552.46854279,\"vol\":346598.40520112,\"vol_cur\":630.37075493,\"last\":488.27857735,\"buy\":489.77564548,\"sell\":492.11726255,\"updated\":1521383876}]}]";
List<RootObject> a = JsonConvert.DeserializeObject<List<RootObject>>(array);
}
}
public class RootCurrency
{
public double high { get; set; }
public int low { get; set; }
public double avg { get; set; }
public double vol { get; set; }
public double vol_cur { get; set; }
public double last { get; set; }
public double buy { get; set; }
public double sell { get; set; }
public int updated { get; set; }
}
public class RootObject
{
public List<RootCurrency> btc_usd { get; set; }
public List<RootCurrency> eth_usd { get; set; }
}
答案 1 :(得分:0)
看起来您的类结构不合适,建议您在Visual Studio的帮助下生成类,如下所示,并使用生成的类来尝试您的代码
基于你的json结构,你需要像这样的类设计
public class Rootobject
{
// do List<CurrencyDetail> if you are expecting multiple element
public CurrencyDetail btc_usd { get; set; }
public CurrencyDetail eth_usd { get; set; }
public CurrencyDetail doge_usd { get; set; }
public CurrencyDetail pac_usd { get; set; }
public CurrencyDetail rdd_usd { get; set; }
}
public class CurrencyDetail
{
public float high { get; set; }
public int low { get; set; }
public float avg { get; set; }
public float vol { get; set; }
public float vol_cur { get; set; }
public float last { get; set; }
public float buy { get; set; }
public float sell { get; set; }
public int updated { get; set; }
}
我的建议是,如果可能的话修改你的json,它将包含货币类型的货币类型,而不是你的类结构
public class Rootobject
{
public List<CurrencyDetail> currencies { get; set; }
}
public class CurrencyDetail
{
//btc_usd or eth_usd or doge_usd or pac_usd
public string type { get; set; }
public float high { get; set; }
public int low { get; set; }
public float avg { get; set; }
public float vol { get; set; }
public float vol_cur { get; set; }
public float last { get; set; }
public float buy { get; set; }
public float sell { get; set; }
public int updated { get; set; }
}