Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.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数据#_C#_Json_Json.net - Fatal编程技术网

C# 在C语言中反序列化JSON数据#

C# 在C语言中反序列化JSON数据#,c#,json,json.net,C#,Json,Json.net,我不熟悉JSON数据,我正在尝试从AWS网站反序列化定价数据。我已经构建了我的类(我做了一个“粘贴特殊>将JSON数据粘贴为类”),但是当我尝试反序列化时,当涉及到Config类时,它会停止。我相信我需要创建一个字典或列出一个列表,但不确定如何正确嵌套它。我尝试过不同的方法,但似乎都不管用。为我指出正确的方向,这样我就可以找出它是非常感谢 public class Rootobject { public float vers { get; set; }

我不熟悉JSON数据,我正在尝试从AWS网站反序列化定价数据。我已经构建了我的类(我做了一个“粘贴特殊>将JSON数据粘贴为类”),但是当我尝试反序列化时,当涉及到Config类时,它会停止。我相信我需要创建一个字典或列出一个列表,但不确定如何正确嵌套它。我尝试过不同的方法,但似乎都不管用。为我指出正确的方向,这样我就可以找出它是非常感谢

    public class Rootobject
    {
        public float vers { get; set; }
        public Config config { get; set; }
    }

    public class Config
    {
        public string rate { get; set; }
        public string valueColumns { get; set; }
        public string currencies { get; set; }
        public Region regions { get; set; }
    }

    public class Region
    {
        public string region { get; set; }
        public Instancetype instanceTypes { get; set; }
    }

    public class Instancetype
    {
        public string type { get; set; }
        public Size sizes { get; set; }
    }

    public class Size
    {
        public string size { get; set; }
        public string vCPU { get; set; }
        public string ECU { get; set; }
        public string memoryGiB { get; set; }
        public string storageGB { get; set; }
        public Valuecolumn valueColumns { get; set; }
    }

    public class Valuecolumn
    {
        public string name { get; set; }
        public Prices prices { get; set; }
    }

    public class Prices
    {
        public string USD { get; set; }
    }



   private static T _download_serialized_json_data<T>(string url) where T : new() {
  using (var w = new WebClient()) {
    var json_data = string.Empty;
    // attempt to download JSON data as a string
    try {
      json_data = w.DownloadString(url);
    }
    catch (Exception) {}
    // if string with JSON data is not empty, deserialize it to class and return its instance 
    return !string.IsNullOrEmpty(json_data) ? JsonConvert.DeserializeObject<T>(json_data) : new T();
  }
}
公共类根对象
{
公共浮点数{get;set;}
公共配置{get;set;}
}
公共类配置
{
公共字符串速率{get;set;}
公共字符串valueColumns{get;set;}
公共字符串{get;set;}
公共区域区域{get;set;}
}
公共类区域
{
公共字符串区域{get;set;}
公共实例类型实例类型{get;set;}
}
公共类实例类型
{
公共字符串类型{get;set;}
公共大小大小{get;set;}
}
公营班级人数
{
公共字符串大小{get;set;}
公共字符串vCPU{get;set;}
公共字符串ECU{get;set;}
公共字符串memoryGiB{get;set;}
公共字符串storageGB{get;set;}
public Valuecolumn valueColumns{get;set;}
}
公共类价值栏
{
公共字符串名称{get;set;}
公共价格{get;set;}
}
公共类价格
{
公共字符串USD{get;set;}
}
私有静态T_下载_序列化的_json_数据(字符串url),其中T:new(){
使用(var w=new WebClient()){
var json_data=string.Empty;
//尝试以字符串形式下载JSON数据
试一试{
json_data=w.DownloadString(url);
}
捕获(异常){}
//若包含JSON数据的字符串不是空的,则将其反序列化到类并返回其实例
return!string.IsNullOrEmpty(json_数据)?JsonConvert.DeserializeObject(json_数据):new T();
}
}

如果我从这里获取JSON并应用您的类

一般来说,问题似乎出在JSON中,它指定了一个值数组,但您的类只需要一个键/值

例如,对于您的配置类(为了简洁起见,我减少了JSON和类),JSON如下所示

{
"vers": 0.01,
"config": {
    "rate": "perhr",
    "valueColumns": [
        "linux",
        "windows"
    ]
}
}
public class Config
{
    public string rate { get; set; }
    public string valueColumns { get; set; }
}
但你们班看起来是这样的

{
"vers": 0.01,
"config": {
    "rate": "perhr",
    "valueColumns": [
        "linux",
        "windows"
    ]
}
}
public class Config
{
    public string rate { get; set; }
    public string valueColumns { get; set; }
}
因此,valueColumns只需要一个值,而不是它们的数组。在JSON中,您可以看到它是一个数组,因为包装值列条目的
[
]
。如果尝试反序列化,将出现异常,例如..:

Additional information: Error reading string. Unexpected token: StartArray. Path 'config.valueColumns', line 5, position 22.
基本上说,我看到了一个数组的开始,但我并不期待它。为了解决这个问题,您只需将该属性更改为类中的数组,如下所示

public class Config
{
    public string rate { get; set; }
    public string[] valueColumns { get; set; }
}

当我们看不到原始JSON时,很难判断您的类应该是什么样子。还要注意,捕获异常并忽略它们绝不是一个好主意。就是这样!谢谢我本该学的,但我对JSON还不熟悉,我仍在努力用我的大脑去理解它。