Reputation: 4619
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:
JsonArray
,JsonObject
,decimal
vs. a value of type int
etc.Upvotes: 1
Views: 84
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
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