【问题标题】:Deserializing json returns 0 [duplicate]反序列化 json 返回 0 [重复]
【发布时间】:2019-03-06 11:20:24
【问题描述】:

我正在尝试反序列化 json 数据,但由于某种原因它总是返回零值。我尝试了不同的方法,但我无法获取该值

var result = JsonConvert.DeserializeObject<Tickers>(json);
       foreach (Rates rate in result)
         {
           Console.WriteLine(rate.EUR); 

         }

Json 看起来像这样:

[
       {
          "base":"USD",
          "date":"2018-06-12",
          "rates":{
             "NZD":1.4053046000828844,
             "EUR":0.8288437629506838
             //plus many more
          }
       }
    ]

我有这些课程:

public class Tickers
{
    public string baseCurrency { get; set; }
    public string date { get; set; }
    public List<Rates> tickers { get; set; }
}

    public class Rates
{
    public double NZD { get; set; }
    public double EUR { get; set; }
    //etc

}

public partial class RootObject
{
    public string @base { get; set; }
    public string date { get; set; }
    public List<Rates> rates { get; set; }
}

【问题讨论】:

  • 这似乎是XY problem。目前状态下的问题也是不完整的,因此不清楚。阅读How to Ask,然后编辑问题以提供可用于重现问题的minimal reproducible example,从而更好地理解所问的内容。
  • 我很困惑。为什么你有一个 Tickers 类和一个 RootObject 类?尽管 json 数据是一个 json 数组(其中包含一个与您的 Tickers 类不匹配的 json 对象),但您为什么要尝试反序列化 Tickers 类类型的对象?不幸的是,您在问题中提出的内容没有多大意义......
  • 我已经尝试过使用 RootObject 但它不起作用,这就是为什么我尝试了更多其他类的原因。反序列化成 RO 返回 SerializationException
  • 是的,尝试反序列化为 Tickers 类型也会导致反序列化器抛出异常(参见我之前的评论)。 “我已经尝试过使用 RootObject” 不要只是尝试随机、任意的东西。因为这种方式更有可能你只会得到随机的、任意的程序行为,而不是预期/期望的行为。 仔细检查 json 数据的结构。它是一个带有 json 对象的 json 数组/列表。因此,您应该反序列化 100% 匹配 json 数组中的 json 对象的(类)类型的数组/列表/集合...
  • 不要repost your question,如果它作为副本被关闭。改为编辑它以解释为什么它不是重复的。

标签: c# json


【解决方案1】:

你没有正确反序列化对象

您可以使用以下 C# 类(使用 quicktype 生成)

public partial class Tickers
{
    [JsonProperty("base")]
    public string Base { get; set; }

    [JsonProperty("date")]
    public DateTimeOffset Date { get; set; }

    [JsonProperty("rates")]
    public Rates Rates { get; set; }
}

public partial class Rates
{
    [JsonProperty("NZD")]
    public double Nzd { get; set; }

    [JsonProperty("EUR")]
    public double Eur { get; set; }
}

然后你有一组代码可以使用,所以反序列化

var results = JsonConvert.DeserializeObject<List<Tickers>>(json);

那么你可以像这样使用它

foreach (Tickers ticker in result)
{
    Console.WriteLine(ticker.Rates.Eur); 
}

【讨论】:

  • 谢谢你,工作就像一个魅力
【解决方案2】:

您应该遍历result.tickers,因为result 是一个包含Rates 列表的对象。

var result = JsonConvert.DeserializeObject<Tickers>(json);
foreach (Rates rate in result.tickers)
{
    Console.WriteLine(rate.EUR); 
}

【讨论】:

  • Newtonsoft.Json.JsonSerializationException: 无法将当前 JSON 数组(例如 [1,2,3])反序列化为类型“Class.Tickers”,因为该类型需要 JSON 对象(例如 {"name" :"value"}) 正确反序列化。
  • @user10990200 这是因为您的 JSON 包含在方括号中。它将它视为一个数组,而不是一个对象。您可以使用var result = JsonConvert.DeserializeObject&lt;List&lt;Tickers&gt;&gt;(json); 或用空格替换方括号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多