如何获取JSON文档中所有属性的列表?

时间:2019-02-06 16:33:27

标签: recursion json.net

我有一个动态JSON文档,但是出于这个问题,请想象它类似于以下内容:

{ "name": "Jungle Gym", "age": 25, "favorite_color": "#ffa500", "gender": "male", "location": { "city": "Seattle", "state": "WA", "citystate": "Seattle, WA" }, "pets": [ { "type": "dog", "name": "Foo", "food": [ "chicken", "beef", "fish" ] }, { "type": "cat", "name": "Bar" } ] }

如何获取文档中所有属性名称的列表?我可以获取顶级属性名称(“名称”,“年龄”,“ favorite_color”,“性别”,“位置”,“宠物”),但是我需要将所有属性名称简化为“ location.state”或“ pets.food”,如果属性/对象存在,则更深。 我开始使用以下内容:

var model = JsonConvert.DeserializeObject<JObject>(json);

foreach (JProperty property in model.Properties())
{
    if (property.Value.Type == JTokenType.Object)
    {
        foreach (var tmp in property.Children())
        {
            Console.WriteLine(tmp.SelectToken().);
        }
    }
}

,但是似乎无法导航到顶级以外的对象中以获取下一级别的属性(例如,位置属性)。理想情况下,我希望派生的属性名称列表包括该属性的完整路径,例如location.citylocation.state等,而不是仅包含属性名称,例如citystate

如何获取JSON文档中可能具有不同嵌套级别的所有属性的列表?

1 个答案:

答案 0 :(得分:1)

为了获取Json字符串(所有级别)中的所有键,可以使用DescendantsPath属性来获取详细信息。

var data = JObject.Parse(jsonString);
var result = data.Descendants()
            .OfType<JProperty>()
            .Select(f=>Regex.Replace(f.Path,@"\[[0-9]\]",string.Empty))
            .Distinct();

请注意,正则表达式用于替换由于宠物列表而可能产生的所有索引。

输出

enter image description here