markvgti
markvgti

Reputation: 4619

How do I know what kind of value or type (object, array etc.) a JsonNode represents?

Once I've converted a JSON stream/ document to a JsonNode, how do I discover what kind of JSON it represents?

For example, given a JsonNode how do I find out whether:

Upvotes: 1

Views: 84

Answers (2)

DavidG
DavidG

Reputation: 119146

You can switch on the derived type, for example:

switch (node)
{
    case JsonArray array:
        Console.WriteLine("is array");
        break;
    
    case JsonObject obj:
        Console.WriteLine("is object");
        break;

    case JsonValue value:
        switch(node.GetValueKind())
        {
            case JsonValueKind.Number:
                Console.WriteLine("is number");
                break;
            case JsonValueKind.String:
                Console.WriteLine("is string");
                break;
                
            //etc.
        }
        break;

    default:
        Console.WriteLine("is something else?!");
        break;
}

Note: To use JsonNode.GetValueKind() in .NET 7 or earlier, you must explicitly add a reference to the System.Text.Json Nuget package.

Upvotes: 3

gecapo
gecapo

Reputation: 169

The JsonNode.Kind property can gives you a JsonValueKind enum, which will tell you if the node is an object, array, or a particular primitive type (e.g., String, Number, Boolean, etc.).

example:

JsonNode jsonNode = JsonNode.Parse(jsonString);
switch (jsonNode.Kind) // or jsonNode.GetValueKind()
{
    case JsonValueKind.Object:
        Console.WriteLine("This is a JsonObject.");
        break;
    case JsonValueKind.Array:
        Console.WriteLine("This is a JsonArray.");
        break;
    case JsonValueKind.String:
        Console.WriteLine("This is a string value.");
        break;
    case JsonValueKind.Number:
        Console.WriteLine("This is a number value.");
        break;
    case JsonValueKind.True:
    case JsonValueKind.False:
        Console.WriteLine("This is a boolean value.");
        break;
    case JsonValueKind.Null:
        Console.WriteLine("This is a null value.");
        break;
}

or Checking if it's a JsonObject or JsonArray

public void CheckJsonNode(JsonNode node)
{
    if (node is JsonObject)
    {
        Console.WriteLine("This is a JsonObject.");
    }
    else if (node is JsonArray)
    {
        Console.WriteLine("This is a JsonArray.");
    }
    else if (node is JsonValue)
    {
        JsonValue value = (JsonValue)node;

        // Check for specific value types
        if (value.TryGetValue(out int intValue))
        {
            Console.WriteLine($"This is an int with value: {intValue}");
        }
        else if (value.TryGetValue(out decimal decimalValue))
        {
            Console.WriteLine($"This is a decimal with value: {decimalValue}");
        }
        else if (value.TryGetValue(out string stringValue))
        {
            Console.WriteLine($"This is a string with value: {stringValue}");
        }
        else
        {
            Console.WriteLine("Unknown primitive value.");
        }
    }
}

Upvotes: -1

Related Questions