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

时间:2015-11-11 13:53:44

标签: c# json serialization

我已成功使用JSON.NET反序列化AWS pricing data

以下是使用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对象的根)开始时,如何能够访问Price类中的数据字段。假设我的RootObject被命名为&#39; root&#39;,我可以得到:

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

但我不知道如何递归访问区域列表中的实际项目,然后是instanceTypes列表等,直到我一直到Price类。

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

谢谢你的时间!

2 个答案:

答案 0 :(得分:2)

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

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范围内可用。

答案 1 :(得分:2)

使用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))));