将JSON反序列化到C#.Net后如何访问嵌套类中的字段

本文关键字:访问 嵌套 字段 何访问 反序列化 JSON Net | 更新日期: 2023-09-27 18:21:27

我已成功使用JSON.NET反序列化AWS定价数据。

以下是使用json2csharp.net:从JSON生成的类

public class Prices
{
    public string USD { get; set; }
}
public class ValueColumn
{
    public string name { get; set; }
    public Prices prices { get; set; }
}
public class Size
{
    public string size { get; set; }
    public List<ValueColumn> valueColumns { get; set; }
}
public class InstanceType
{
    public string type { get; set; }
    public List<Size> sizes { get; set; }
}
public class Region
{
    public string region { get; set; }
    public List<InstanceType> instanceTypes { get; set; }
}
public class Config
{
    public string rate { get; set; }
    public List<string> valueColumns { get; set; }
    public List<string> currencies { get; set; }
    public List<Region> regions { get; set; }
}
public class RootObject
{
    public double vers { get; set; }
    public Config config { get; set; }
}

当从RootObject(表示反序列化JSON对象的根)开始时,我不知道如何访问Prices类中的数据字段。假设我的RootObject被命名为"root",我可以达到:

Console.WriteLine(root.config.regions.count);

但我不知道如何递归地访问regions列表中的实际项目,然后是instanceTypes列表,等等,直到我找到Prices类。

稍微不同的是,我需要帮助从根级别一直到叶级别递归我的反序列化JSON对象,这样我就可以访问那里的数据字段(以及两者之间的任何地方)。我希望我已经清楚了,因为这是我第一次使用JSON/反序列化/C#。

谢谢你抽出时间!

将JSON反序列化到C#.Net后如何访问嵌套类中的字段

以下是您可能想要做的事情:

var rootObject = JsonConvert.DeserializeObject<RootObject>(awsJsonData);
foreach(var region in rootObject.config)
{
    //Work with regions here
    foreach(var instanceType in region.instanceTypes)
    {
        //work with this regions instance types here
        foreach(var size in instanceType.sizes)
        {
            //work with this instance types sizes here
            (etc...)
        }
    }
}

一旦您在valuecolumn.prices中找到foreach价格,您就可以随心所欲地组合数据,因为父对象在foreach范围内可用。

使用LINQ

    RootObject root = new RootObject();
    var regions = root.config.regions;
    var instanceTypes = regions.Select(x => x.instanceTypes);
    var sizes = instanceTypes.Select(s => s.Select(c => c.sizes));
    var valueColumns = sizes.Select(v => v.Select(p => p.Select(q => q.valueColumns)));
    var prices = valueColumns.Select(x => x.Select(p => p.Select(r => r.Select(q => q.prices.USD))));