以递归方式迭代 JsonDocument

kaf*_*fka 5 c# system.text.json

我需要迭代 JsonDocument 并根据我遇到的情况执行某种检查JsonValueKind

我尝试以这种方式进行验证检查:

public bool Dec(JsonElement Element)
{
    var ElementEnumeratable = Element.EnumerateObject();

    foreach (var Elm in ElementEnumeratable )
    {
        string name = Elm.Name;
        switch (Elm.Value.ValueKind)
        {
            case JsonValueKind.Array:
                var jArray = Elm.Value;
                return Dec(jArray);
            case JsonValueKind.String:
                string jString = Elm.Value.GetString();
                break;
            case JsonValueKind.Number:
                int jNumber = Elm.Value.GetInt32();
                break;
        }
    }

    return true;
}
Run Code Online (Sandbox Code Playgroud)

这里的问题是当ElmValueKind数组时 - 我无法将它传递给Dec看起来JsonElement有 valuekind 作为数组的数组,无法转换为EnumerateObject

在这里做什么?

Sel*_*diz 7

据我了解,如果ValueKindJsonValueKind.Array那么您需要使用来迭代数组,EnumerateArray()以便您将拥有JsonElement并调用Dec foreach 元素来验证每个元素,如下所示:

public static bool Dec(JsonElement Element)
{

    var ElementEnumeratable = Element.EnumerateObject();

    foreach (var Elm in ElementEnumeratable)
    {
        string name = Elm.Name;
        switch (Elm.Value.ValueKind)
        {
            case JsonValueKind.Array:
                var jArray = Elm.Value;
                foreach (var item in jArray.EnumerateArray())
                {
                    Dec(item);
                }
                break;
            case JsonValueKind.String:
                string jString = Elm.Value.GetString();
                break;
            case JsonValueKind.Number:
                int jNumber = Elm.Value.GetInt32();
                break;
        }
    }

    return true;
}
Run Code Online (Sandbox Code Playgroud)

  • 如果数组中有数组,此示例代码将会出现问题(因为后续的递归调用将抛出“EnumerateObject”)。“Dec”的实现应该预先检查它是对象还是数组,并根据“ValueKind”调用正确的枚举器,而不是假设输入始终是 JSON 对象。 (2认同)