【问题标题】:Deserialize JSON to a class (Newtonsoft, C#)将 JSON 反序列化为一个类(Newtonsoft、C#)
【发布时间】:2018-03-18 14:34:15
【问题描述】:

我正在尝试将 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<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 对象反序列化的数组或列表。 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,或者给我一些可以帮助我解决这个问题的信息。

【问题讨论】:

  • 例如将您的 JSON 粘贴到 jsonviewer.stack.hu 中,然后查看您得到的对象。然后在你尝试的时候反序列化它

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


【解决方案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; }
}

【讨论】:

    【解决方案2】:

    您的类结构看起来不正确,建议您在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; }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-13
      • 2017-10-16
      • 2013-06-06
      • 1970-01-01
      相关资源
      最近更新 更多