Пересмотрите jsondocument рекурсивным способом - PullRequest
0 голосов
/ 03 апреля 2020

Мне нужно перебрать 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, похоже, JsonElement, который имеет valuekind как массив, не может быть преобразован в EnumerateObject?

Что здесь делать?

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

Как я понимаю, если ValueKind равно JsonValueKind.Array, то вам нужно выполнить итерацию массива, используя EnumerateArray(), чтобы у вас был JElement и элемент * foreach для вызова 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;
}
0 голосов
/ 03 апреля 2020

Я думаю, вы переключаетесь не в том месте. Если Dec() вызывается с массивом, он все равно будет вызывать EnumerateObject(). Для массива необходимо вызвать EnumerateArray().

...