C# 它以递归方式通过jsondocument创建

C# 它以递归方式通过jsondocument创建,c#,system.text.json,C#,System.text.json,我需要遍历Jsondocument,并根据遇到的JsonValueKind执行某种检查 我试图以这种方式进行验证检查 public bool Dec(JsonElement Element) { var ElementEnumeratable = Element.EnumerateObject(); foreach (var Elm in ElementEnumeratable ) { string name = Elm.Name; s

我需要遍历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;
}
这里的问题是当
Elm
具有
ValueKind
数组时-我无法将其传递给
Dec
似乎将valuekind作为数组的JsonElement无法转换为EnumerateObject


在这里怎么办?

我认为你在错误的地方切换。如果使用数组调用
Dec()
,它仍将调用
EnumerateObject()
。它需要为数组调用
EnumerateArray()

我认为您在错误的位置进行了切换。如果使用数组调用
Dec()
,它仍将调用
EnumerateObject()
。它需要为数组调用
EnumerateArray()

据我所知,如果
ValueKind
JsonValueKind.array
,那么您需要使用迭代数组,这样您将拥有
jeelement
并为每个元素调用
Dec
来验证它们,如下所示:

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;
}

据我所知,如果
ValueKind
JsonValueKind.Array
,那么您需要使用迭代数组,这样您将拥有
jeelement
并调用每个元素的
Dec
来验证它们,如下所示:

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;
}

你想在这里实现什么?您的
Dec
方法需要
JsonElement
类型的参数,但您正在发送
Array
。我想对字符串和数字进行一些验证,但有时我会得到一个数组=>在这种情况下,我需要遍历它,并对字符串和数字执行检查…@kafka-My对您前面的问题显示了一个你想在这里实现什么?您的
Dec
方法需要
JsonElement
类型的参数,但您正在发送
Array
。我想对字符串和数字进行一些验证,但有时我会得到一个数组=>在这种情况下,我需要遍历它,并对字符串和数字执行检查…@kafka-My对您前面的问题显示了一个如果您在数组中有数组,那么这个示例代码将发出尖锐的声音(因为随后的递归调用将抛出
EnumerateObject
)。
Dec
的实现应该预先检查它是对象还是数组,并基于
ValueKind
调用正确的枚举器,而不是假设输入始终是JSON对象。如果数组中有数组,则此示例代码会发出尖锐的声音(因为随后的递归调用将抛出
EnumerateObject
)。
Dec
的实现应该预先检查它是对象还是数组,并基于
ValueKind
调用正确的枚举器,而不是假设输入始终是JSON对象。