Search code examples
c#system.text.json

Iterate through a JsonDocument in a recursive way


I need to iterate through an JsonDocument and perform some sort of check depending on the JsonValueKind I encounter.

I tried to do this validation check in such manner:

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

Problem here is when Elm has ValueKind array - I cannot pass it to the Dec it seems like JsonElement which has valuekind as array, cannot be converted into an EnumerateObject?

What to do here?


Solution

  • As I understand, if ValueKind is JsonValueKind.Array then you need to iterate array by using EnumerateArray() so that you will have JsonElement and call Dec foreach element to validate each of them, like this:

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