Skip to content

Add ValueKind property in System.Text.Json.Nodes.JsonNode class #53406

@kingcean

Description

@kingcean

Background and Motivation

System.Text.Json.Node.JsonNode has provided a way to as JsonObject, JsonArray and JsonValue, but has no way to get its value kind directly.

Proposed API

namespace System.Text.Json.Nodes
{
    public abstract class JsonNode : IDynamicMetaObjectProvider {
+        public abstract JsonValueKind ValueKind { get; }
    }
}

Usage Examples

var json = JsonNode.Parse("{ \"name\": \"Kingcean\" }");
Assert.AreEqual(JsonValueKind.Object, json.ValueKind );
Assert.AreEqual(JsonValueKind.String, json["name"].ValueKind ;

Implementation for Reference

// namespace System.Text.Json.Nodes
public abstract class JsonNode
{
    public abstract JsonValueKind ValueKind { get; }
    // ...
}
public sealed class JsonArray : JsonNode, IList<JsonNode?>, ICollection<JsonNode?>, IEnumerable<JsonNode?>, IEnumerable
{
    public override JsonValueKind ValueKind => JsonValueKind.Array;
    // ...
}
public sealed class JsonObject : JsonNode, IDictionary<string, JsonNode?>, ICollection<KeyValuePair<string, JsonNode?>>, IEnumerable<KeyValuePair<string, JsonNode?>>, IEnumerable
{
    public override JsonValueKind ValueKind => JsonValueKind.Object;
    // ...
}
internal abstract partial class JsonValue<TValue> : JsonValue
{
    public override JsonValueKind ValueKind
    {
        get
        {
            if (_value is null) return JsonValueKind.Null;
            if (_value is JsonElement element) return element.ValueKind;
            if (_value is string || _value is Guid || _value is DateTime || _value is DateTimeOffset) return JsonValueKind.String;
            if (_value is bool b) return b ? JsonValueKind.True : JsonValueKind.False;
            if (_value is int || _value is long || _value is uint || _value is ulong || _value is short || _value is ushort || _value is double || _value is float || _value is decimal || _value is byte ||  || _value is sbyte) return JsonValueKind.Number;
            throw new NotSupportedException();
        }
    }
    // ...
}

Metadata

Metadata

Assignees

Labels

api-suggestionEarly API idea and discussion, it is NOT ready for implementationarea-System.Text.Jsonneeds-further-triageIssue has been initially triaged, but needs deeper consideration or reconsideration

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions