Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中反序列化json时出现问题;无法反序列化当前JSON对象";_C#_Json - Fatal编程技术网

C# 在C中反序列化json时出现问题;无法反序列化当前JSON对象";

C# 在C中反序列化json时出现问题;无法反序列化当前JSON对象";,c#,json,C#,Json,我正在尝试对json进行反序列化,很明显,由于我在这里,它进展得并不顺利。我不仅在寻找帮助,使它的工作,但也有一些链接,它解释了它是如何工作的,因为我找不到一个,我想学习 var json = w.DownloadString(url); var data = JsonConvert.DeserializeObject<Rates[]>(json); 我有以下课程: public class Rates { public List<Data&

我正在尝试对json进行反序列化,很明显,由于我在这里,它进展得并不顺利。我不仅在寻找帮助,使它的工作,但也有一些链接,它解释了它是如何工作的,因为我找不到一个,我想学习

var json = w.DownloadString(url);

var data = JsonConvert.DeserializeObject<Rates[]>(json);
我有以下课程:

    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; }
    }
}
公共类费率
{
公共列表数据{get;set;}
}
公共类数据
{
公共整数日期{get;set;}
公共字符串交换{get;set;}
公共双开{get;set;}
公共双高{get;set;}
公共双低位{get;set;}
}
公共类根对象
{
公共字符串信息{get;set;}
公共字符串sub{get;set;}
公共列表数据{get;set;}
}
}
有两个问题

首先,您的JSON是无效的(至少在问题本身中是如此)。。您缺少一个数组结束括号,但我怀疑这是一个输入错误

除此之外,您希望反序列化到
Rates
类而不是Rates数组中

var data=JsonConvert.DeserializeObject(json)


列举各种费率。。使用以下命令:

foreach(Data rate in data.data){

    Console.WriteLine(rate.exchange);

}

查看此

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

您需要将json反序列化到根对象中

var root = JsonConvert.DeserializeObject<RootObject>(json);
作为旁注,
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
      }
    ]
  }
]

看起来我把它弄糟了,把它缩短了。我会尽快修复它,这是一个打字错误,但现在已经修复了。谢谢你,但是我该如何循环浏览这个费率列表呢?不是enumerable@user10990200请参阅编辑和更新的dotnetfiddle。@user10990200:Re:“如何循环浏览该费率列表”。您没有“速率列表”,而是有一个包含两个字符串和一个数据列表的速率实例。数据列表是可枚举的。谢谢,被认为是正确的。有什么好的读物可以学习如何理解这一点吗?这已经不是我第一次在c语言中遇到反序列化问题了,这要看json是什么样子了。。如果它是一个数组,也就是说,它看起来像这样:[{x:1},{x:2}],那么你有一个数组,但是你可以看到你的左括号是{,所以它是一个单独的对象。
foreach (Data dataItem in root.data)
{
    // Do something with data
}
[
  {
    "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
      }
    ]
  }
]