【问题标题】:How to Access Fields in Nested Classes after Deserialzing JSON to C# .Net将 JSON 反序列化为 C# .Net 后如何访问嵌套类中的字段
【发布时间】:2015-11-11 23:10:02
【问题描述】:

我已成功使用 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 对象的根)开头时如何访问 Prices 类中的数据字段。假设我的 RootObject 被命名为“root”,我可以做到:

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

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

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

感谢您的宝贵时间!

【问题讨论】:

    标签: c# json serialization


    【解决方案1】:

    这是您可能想要做的事情:

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

    【讨论】:

    • 嗨,鲍勃!在这方面做得很好,谢谢。这就是我目前实际拥有的,但是嵌套这么多层次的深度感觉有些不对劲。它似乎有效,你是对的,但感觉就像我错过了一种更“正确”的方法。
    【解决方案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))));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多