在 C# 中反序列化 JSON 数据

本文关键字:JSON 数据 反序列化 | 更新日期: 2023-09-27 18:33:21

我是处理 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();
  }
}

在 C# 中反序列化 JSON 数据

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

https://a0.awsstatic.com/pricing/1/deprecated/ec2/pricing-on-demand-instances.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; }
}

因此,您的 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; }
}