在C#中反序列化JSON时出现问题-“无法反序列化当前JSON对象”

时间:2019-03-05 20:31:16

标签: c# json

我正在尝试反序列化json,因为我在这里,所以显然运行不顺利。我不仅在寻求帮助以使其运行,而且还在一些链接中对其进行了解释,因为我找不到一个并且想学习。

var json = w.DownloadString(url);

var data = JsonConvert.DeserializeObject<Rates[]>(json);

Json看起来像这样:

 {
   "info":"text",
   "sub":"text",
   "data":[
      {
         "date":20181111,
         "exchange":"New York",
         "open":1000.43,
         "high":1239.91,
         "low":1231.41
      },
      {
         "date":20181111,
         "exchange":"New York",
         "open":1000.43,
         "high":1239.91,
         "low":1231.41
      }
   ]
}

我有这些课程:

    public class Rates
    {
        public List<Data> data { get; set; }
    }

    public class Data
    {
        public int date { get; set; }
        public string exchange { get; set; }
        public double open { get; set; }
        public double high { get; set; }
        public double low { get; set; }
    }

    public class RootObject
    {
        public string info { get; set; }
        public string sub { get; set; }
        public List<Data> data { get; set; }
    }
}

2 个答案:

答案 0 :(得分:1)

有两个问题。

首先是您的JSON无效(至少在问题本身中)..您缺少数组右括号,但我怀疑这是一个错字。

除了您要反序列化到Rates类中,而不是比率数组以外。

var data = JsonConvert.DeserializeObject<Rates>(json);


要通过费率枚举,请使用以下内容:

foreach(Data rate in data.data){

    Console.WriteLine(rate.exchange);

}

查看此dotnetfiddle.

答案 1 :(得分:0)

您返回的json字符串表示根对象。您的类看起来不错,您只是反序列化为错误的对象。 Rates对象似乎是不必要的,除非您不关心'info'和'sub'字段。在这种情况下,您可以反序列化为Rates对象。额外的属性只会被序列化程序忽略。

您将需要将json反序列化为根对象。

var root = JsonConvert.DeserializeObject<RootObject>(json);

然后,您可以像这样遍历数据对象:

foreach (Data dataItem in root.data)
{
    // Do something with data
}

作为一个旁注,Rates[]在json格式下看起来会像这样:

[
  {
    "data": [
      {
         "date":20181111,
         "exchange":"New York",
         "open":1000.43,
         "high":1239.91,
         "low":1231.41
      },
      {
         "date":20181111,
         "exchange":"New York",
         "open":1000.43,
         "high":1239.91,
         "low":1231.41
      }
    ]
  },
  {
    "data": [
      {
         "date":20181111,
         "exchange":"New York",
         "open":1000.43,
         "high":1239.91,
         "low":1231.41
      },
      {
         "date":20181111,
         "exchange":"New York",
         "open":1000.43,
         "high":1239.91,
         "low":1231.41
      }
    ]
  }
]