我已成功使用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#。
谢谢你的时间!
答案 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))));