-
Notifications
You must be signed in to change notification settings - Fork 5.2k
Closed
Labels
api-suggestionEarly API idea and discussion, it is NOT ready for implementationEarly API idea and discussion, it is NOT ready for implementationarea-System.Text.Jsonneeds-further-triageIssue has been initially triaged, but needs deeper consideration or reconsiderationIssue has been initially triaged, but needs deeper consideration or reconsideration
Milestone
Description
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();
}
}
// ...
}
kevinchalet
Metadata
Metadata
Assignees
Labels
api-suggestionEarly API idea and discussion, it is NOT ready for implementationEarly API idea and discussion, it is NOT ready for implementationarea-System.Text.Jsonneeds-further-triageIssue has been initially triaged, but needs deeper consideration or reconsiderationIssue has been initially triaged, but needs deeper consideration or reconsideration