将JSON反序列化为类(Newtonsoft,C#)

时间:2018-03-18 14:34:15

标签: c# json json.net json-deserialization

我正在尝试将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,或者给我一些可以帮助我解决这个问题的信息。

2 个答案:

答案 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的帮助下生成类,如下所示,并使用生成的类来尝试您的代码

enter image description here

基于你的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; }
}