JsonNode
The base class that represents a single node within a mutable JSON document.
using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Runtime.CompilerServices;
using System.Text.Json.Serialization.Converters;
using System.Text.Json.Serialization.Metadata;
using System.Threading;
using System.Threading.Tasks;
namespace System.Text.Json.Nodes
{
[System.Runtime.CompilerServices.NullableContext(1)]
[System.Runtime.CompilerServices.Nullable(0)]
public abstract class JsonNode
{
private protected static readonly JsonSerializerOptions s_defaultOptions = new JsonSerializerOptions();
private JsonNode _parent;
private JsonNodeOptions? _options;
internal virtual JsonElement? UnderlyingElement => null;
public JsonNodeOptions? Options {
get {
if (!_options.HasValue && Parent != null)
_options = Parent.Options;
return _options;
}
}
[System.Runtime.CompilerServices.Nullable(2)]
public JsonNode Parent {
[System.Runtime.CompilerServices.NullableContext(2)]
get {
return _parent;
}
internal set {
_parent = value;
}
}
public JsonNode Root {
get {
JsonNode parent = Parent;
if (parent == null)
return this;
while (parent.Parent != null) {
parent = parent.Parent;
}
return parent;
}
}
[System.Runtime.CompilerServices.Nullable(2)]
public JsonNode this[int index] {
[System.Runtime.CompilerServices.NullableContext(2)]
get {
return GetItem(index);
}
[System.Runtime.CompilerServices.NullableContext(2)]
set {
SetItem(index, value);
}
}
[System.Runtime.CompilerServices.Nullable(2)]
public JsonNode this[string propertyName] {
[return: System.Runtime.CompilerServices.Nullable(2)]
get {
return AsObject().GetItem(propertyName);
}
[param: System.Runtime.CompilerServices.Nullable(2)]
set {
AsObject().SetItem(propertyName, value);
}
}
internal JsonNode(JsonNodeOptions? options = default(JsonNodeOptions?))
{
_options = options;
}
public JsonArray AsArray()
{
JsonArray jsonArray = this as JsonArray;
if (jsonArray == null) {
object obj = global::<PrivateImplementationDetails>.43124F66689BF28A6C659604DD40EA12126064F91162A1EA50186FD55BD9A045_B11;
if (obj == null) {
obj = new string[1] {
"JsonArray"
};
global::<PrivateImplementationDetails>.43124F66689BF28A6C659604DD40EA12126064F91162A1EA50186FD55BD9A045_B11 = (string[])obj;
}
ThrowHelper.ThrowInvalidOperationException_NodeWrongType(new ReadOnlySpan<string>((string[])obj));
}
return jsonArray;
}
public JsonObject AsObject()
{
JsonObject jsonObject = this as JsonObject;
if (jsonObject == null) {
object obj = global::<PrivateImplementationDetails>.6EEC039761107FCBC99B7D0010A33ADCCCC6D149369D1448F5DD990C8E8D9C22_B11;
if (obj == null) {
obj = new string[1] {
"JsonObject"
};
global::<PrivateImplementationDetails>.6EEC039761107FCBC99B7D0010A33ADCCCC6D149369D1448F5DD990C8E8D9C22_B11 = (string[])obj;
}
ThrowHelper.ThrowInvalidOperationException_NodeWrongType(new ReadOnlySpan<string>((string[])obj));
}
return jsonObject;
}
public JsonValue AsValue()
{
JsonValue jsonValue = this as JsonValue;
if (jsonValue == null) {
object obj = global::<PrivateImplementationDetails>.655BDAA2B8C76C1E302EC9AC19D18270115A7BC573F22C64E99060D8C27A32AB_B11;
if (obj == null) {
obj = new string[1] {
"JsonValue"
};
global::<PrivateImplementationDetails>.655BDAA2B8C76C1E302EC9AC19D18270115A7BC573F22C64E99060D8C27A32AB_B11 = (string[])obj;
}
ThrowHelper.ThrowInvalidOperationException_NodeWrongType(new ReadOnlySpan<string>((string[])obj));
}
return jsonValue;
}
public unsafe string GetPath()
{
if (Parent == null)
return "$";
Span<char> initialBuffer = new Span<char>(stackalloc byte[256], 128);
System.Text.ValueStringBuilder path = new System.Text.ValueStringBuilder(initialBuffer);
path.Append('$');
GetPath(ref path, null);
return path.ToString();
}
internal abstract void GetPath(ref System.Text.ValueStringBuilder path, JsonNode child);
public virtual T GetValue<[System.Runtime.CompilerServices.Nullable(2)] T>()
{
throw new InvalidOperationException(System.SR.Format(System.SR.NodeWrongType, "JsonValue"));
}
private protected virtual JsonNode GetItem(int index)
{
object obj = global::<PrivateImplementationDetails>.861A6C24FD9D8C98168C4A642368515FFB3C2373689C2E1794F6FB226CE7E4E2_B11;
if (obj == null) {
obj = new string[2] {
"JsonArray",
"JsonObject"
};
global::<PrivateImplementationDetails>.861A6C24FD9D8C98168C4A642368515FFB3C2373689C2E1794F6FB226CE7E4E2_B11 = (string[])obj;
}
ThrowHelper.ThrowInvalidOperationException_NodeWrongType(new ReadOnlySpan<string>((string[])obj));
return null;
}
private protected virtual void SetItem(int index, JsonNode node)
{
object obj = global::<PrivateImplementationDetails>.861A6C24FD9D8C98168C4A642368515FFB3C2373689C2E1794F6FB226CE7E4E2_B11;
if (obj == null) {
obj = new string[2] {
"JsonArray",
"JsonObject"
};
global::<PrivateImplementationDetails>.861A6C24FD9D8C98168C4A642368515FFB3C2373689C2E1794F6FB226CE7E4E2_B11 = (string[])obj;
}
ThrowHelper.ThrowInvalidOperationException_NodeWrongType(new ReadOnlySpan<string>((string[])obj));
}
public JsonNode DeepClone()
{
return DeepCloneCore();
}
internal abstract JsonNode DeepCloneCore();
public JsonValueKind GetValueKind()
{
return GetValueKindCore();
}
private protected abstract JsonValueKind GetValueKindCore();
public string GetPropertyName()
{
JsonObject obj = _parent as JsonObject;
if (obj == null)
ThrowHelper.ThrowInvalidOperationException_NodeParentWrongType("JsonObject");
return obj.GetPropertyName(this);
}
public int GetElementIndex()
{
JsonArray obj = _parent as JsonArray;
if (obj == null)
ThrowHelper.ThrowInvalidOperationException_NodeParentWrongType("JsonArray");
return obj.GetElementIndex(this);
}
[System.Runtime.CompilerServices.NullableContext(2)]
public static bool DeepEquals(JsonNode node1, JsonNode node2)
{
if (node1 == null)
return node2 == null;
if (node2 == null)
return false;
return node1.DeepEqualsCore(node2);
}
internal abstract bool DeepEqualsCore(JsonNode node);
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("Creating JsonValue instances with non-primitive types is not compatible with trimming. It can result in non-primitive types being serialized, which may have their members trimmed.")]
[System.Diagnostics.CodeAnalysis.RequiresDynamicCode("Creating JsonValue instances with non-primitive types requires generating code at runtime.")]
public void ReplaceWith<[System.Runtime.CompilerServices.Nullable(2)] T>(T value)
{
JsonNode parent = _parent;
JsonObject jsonObject = parent as JsonObject;
if (jsonObject == null) {
JsonArray jsonArray = parent as JsonArray;
if (jsonArray != null) {
JsonNode node = ConvertFromValue(value, null);
jsonArray.SetItem(GetElementIndex(), node);
}
} else {
JsonNode node = ConvertFromValue(value, null);
jsonObject.SetItem(GetPropertyName(), node);
}
}
internal void AssignParent(JsonNode parent)
{
if (Parent != null)
ThrowHelper.ThrowInvalidOperationException_NodeAlreadyHasParent();
for (JsonNode jsonNode = parent; jsonNode != null; jsonNode = jsonNode.Parent) {
if (jsonNode == this)
ThrowHelper.ThrowInvalidOperationException_NodeCycleDetected();
}
Parent = parent;
}
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")]
[System.Diagnostics.CodeAnalysis.RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")]
internal static JsonNode ConvertFromValue<T>(T value, JsonNodeOptions? options = default(JsonNodeOptions?))
{
if (value == null)
return null;
JsonNode jsonNode = value as JsonNode;
if (jsonNode != null)
return jsonNode;
if (((object)value) is JsonElement) {
JsonElement element = value as JsonElement;
return JsonNodeConverter.Create(element, options);
}
JsonTypeInfo<T> jsonTypeInfo = (JsonTypeInfo<T>)JsonSerializerOptions.Default.GetTypeInfo(typeof(T));
return JsonValue.CreateFromTypeInfo(value, jsonTypeInfo, options);
}
public static implicit operator JsonNode(bool value)
{
return JsonValue.Create(value, (JsonNodeOptions?)null);
}
public static implicit operator JsonNode(bool? value)
{
return JsonValue.Create(value, (JsonNodeOptions?)null);
}
public static implicit operator JsonNode(byte value)
{
return JsonValue.Create(value, (JsonNodeOptions?)null);
}
public static implicit operator JsonNode(byte? value)
{
return JsonValue.Create(value, (JsonNodeOptions?)null);
}
public static implicit operator JsonNode(char value)
{
return JsonValue.Create(value, (JsonNodeOptions?)null);
}
public static implicit operator JsonNode(char? value)
{
return JsonValue.Create(value, (JsonNodeOptions?)null);
}
public static implicit operator JsonNode(DateTime value)
{
return JsonValue.Create(value, (JsonNodeOptions?)null);
}
public static implicit operator JsonNode(DateTime? value)
{
return JsonValue.Create(value, (JsonNodeOptions?)null);
}
public static implicit operator JsonNode(DateTimeOffset value)
{
return JsonValue.Create(value, (JsonNodeOptions?)null);
}
public static implicit operator JsonNode(DateTimeOffset? value)
{
return JsonValue.Create(value, (JsonNodeOptions?)null);
}
public static implicit operator JsonNode(decimal value)
{
return JsonValue.Create(value, (JsonNodeOptions?)null);
}
public static implicit operator JsonNode(decimal? value)
{
return JsonValue.Create(value, (JsonNodeOptions?)null);
}
public static implicit operator JsonNode(double value)
{
return JsonValue.Create(value, (JsonNodeOptions?)null);
}
public static implicit operator JsonNode(double? value)
{
return JsonValue.Create(value, (JsonNodeOptions?)null);
}
public static implicit operator JsonNode(Guid value)
{
return JsonValue.Create(value, (JsonNodeOptions?)null);
}
public static implicit operator JsonNode(Guid? value)
{
return JsonValue.Create(value, (JsonNodeOptions?)null);
}
public static implicit operator JsonNode(short value)
{
return JsonValue.Create(value, (JsonNodeOptions?)null);
}
public static implicit operator JsonNode(short? value)
{
return JsonValue.Create(value, (JsonNodeOptions?)null);
}
public static implicit operator JsonNode(int value)
{
return JsonValue.Create(value, (JsonNodeOptions?)null);
}
public static implicit operator JsonNode(int? value)
{
return JsonValue.Create(value, (JsonNodeOptions?)null);
}
public static implicit operator JsonNode(long value)
{
return JsonValue.Create(value, (JsonNodeOptions?)null);
}
public static implicit operator JsonNode(long? value)
{
return JsonValue.Create(value, (JsonNodeOptions?)null);
}
public static implicit operator JsonNode(sbyte value)
{
return JsonValue.Create(value, (JsonNodeOptions?)null);
}
public static implicit operator JsonNode(sbyte? value)
{
return JsonValue.Create(value, (JsonNodeOptions?)null);
}
public static implicit operator JsonNode(float value)
{
return JsonValue.Create(value, (JsonNodeOptions?)null);
}
public static implicit operator JsonNode(float? value)
{
return JsonValue.Create(value, (JsonNodeOptions?)null);
}
public static implicit operator JsonNode(string value)
{
return JsonValue.Create(value, (JsonNodeOptions?)null);
}
public static implicit operator JsonNode(ushort value)
{
return JsonValue.Create(value, (JsonNodeOptions?)null);
}
public static implicit operator JsonNode(ushort? value)
{
return JsonValue.Create(value, (JsonNodeOptions?)null);
}
public static implicit operator JsonNode(uint value)
{
return JsonValue.Create(value, (JsonNodeOptions?)null);
}
public static implicit operator JsonNode(uint? value)
{
return JsonValue.Create(value, (JsonNodeOptions?)null);
}
public static implicit operator JsonNode(ulong value)
{
return JsonValue.Create(value, (JsonNodeOptions?)null);
}
public static implicit operator JsonNode(ulong? value)
{
return JsonValue.Create(value, (JsonNodeOptions?)null);
}
public static explicit operator bool(JsonNode value)
{
return value.GetValue<bool>();
}
public static explicit operator bool?(JsonNode value)
{
return value?.GetValue<bool>();
}
public static explicit operator byte(JsonNode value)
{
return value.GetValue<byte>();
}
public static explicit operator byte?(JsonNode value)
{
return value?.GetValue<byte>();
}
public static explicit operator char(JsonNode value)
{
return value.GetValue<char>();
}
public static explicit operator char?(JsonNode value)
{
return value?.GetValue<char>();
}
public static explicit operator DateTime(JsonNode value)
{
return value.GetValue<DateTime>();
}
public static explicit operator DateTime?(JsonNode value)
{
return value?.GetValue<DateTime>();
}
public static explicit operator DateTimeOffset(JsonNode value)
{
return value.GetValue<DateTimeOffset>();
}
public static explicit operator DateTimeOffset?(JsonNode value)
{
return value?.GetValue<DateTimeOffset>();
}
public static explicit operator decimal(JsonNode value)
{
return value.GetValue<decimal>();
}
public static explicit operator decimal?(JsonNode value)
{
return value?.GetValue<decimal>();
}
public static explicit operator double(JsonNode value)
{
return value.GetValue<double>();
}
public static explicit operator double?(JsonNode value)
{
return value?.GetValue<double>();
}
public static explicit operator Guid(JsonNode value)
{
return value.GetValue<Guid>();
}
public static explicit operator Guid?(JsonNode value)
{
return value?.GetValue<Guid>();
}
public static explicit operator short(JsonNode value)
{
return value.GetValue<short>();
}
public static explicit operator short?(JsonNode value)
{
return value?.GetValue<short>();
}
public static explicit operator int(JsonNode value)
{
return value.GetValue<int>();
}
public static explicit operator int?(JsonNode value)
{
return value?.GetValue<int>();
}
public static explicit operator long(JsonNode value)
{
return value.GetValue<long>();
}
public static explicit operator long?(JsonNode value)
{
return value?.GetValue<long>();
}
public static explicit operator sbyte(JsonNode value)
{
return value.GetValue<sbyte>();
}
public static explicit operator sbyte?(JsonNode value)
{
return value?.GetValue<sbyte>();
}
public static explicit operator float(JsonNode value)
{
return value.GetValue<float>();
}
public static explicit operator float?(JsonNode value)
{
return value?.GetValue<float>();
}
public static explicit operator string(JsonNode value)
{
return value?.GetValue<string>();
}
public static explicit operator ushort(JsonNode value)
{
return value.GetValue<ushort>();
}
public static explicit operator ushort?(JsonNode value)
{
return value?.GetValue<ushort>();
}
public static explicit operator uint(JsonNode value)
{
return value.GetValue<uint>();
}
public static explicit operator uint?(JsonNode value)
{
return value?.GetValue<uint>();
}
public static explicit operator ulong(JsonNode value)
{
return value.GetValue<ulong>();
}
public static explicit operator ulong?(JsonNode value)
{
return value?.GetValue<ulong>();
}
[System.Runtime.CompilerServices.NullableContext(2)]
public static JsonNode Parse(ref Utf8JsonReader reader, JsonNodeOptions? nodeOptions = default(JsonNodeOptions?))
{
return JsonNodeConverter.Create(JsonElement.ParseValue(ref reader), nodeOptions);
}
[return: System.Runtime.CompilerServices.Nullable(2)]
public static JsonNode Parse([System.Diagnostics.CodeAnalysis.StringSyntax("Json")] string json, JsonNodeOptions? nodeOptions = default(JsonNodeOptions?), JsonDocumentOptions documentOptions = default(JsonDocumentOptions))
{
if (json == null)
ThrowHelper.ThrowArgumentNullException("json");
return JsonNodeConverter.Create(JsonElement.ParseValue(json, documentOptions), nodeOptions);
}
[System.Runtime.CompilerServices.NullableContext(0)]
[return: System.Runtime.CompilerServices.Nullable(2)]
public static JsonNode Parse(ReadOnlySpan<byte> utf8Json, JsonNodeOptions? nodeOptions = default(JsonNodeOptions?), JsonDocumentOptions documentOptions = default(JsonDocumentOptions))
{
return JsonNodeConverter.Create(JsonElement.ParseValue(utf8Json, documentOptions), nodeOptions);
}
[return: System.Runtime.CompilerServices.Nullable(2)]
public static JsonNode Parse(Stream utf8Json, JsonNodeOptions? nodeOptions = default(JsonNodeOptions?), JsonDocumentOptions documentOptions = default(JsonDocumentOptions))
{
if (utf8Json == null)
ThrowHelper.ThrowArgumentNullException("utf8Json");
return JsonNodeConverter.Create(JsonElement.ParseValue(utf8Json, documentOptions), nodeOptions);
}
[AsyncStateMachine(typeof(<ParseAsync>d__108))]
[return: System.Runtime.CompilerServices.Nullable(new byte[] {
1,
2
})]
public static Task<JsonNode> ParseAsync(Stream utf8Json, JsonNodeOptions? nodeOptions = default(JsonNodeOptions?), JsonDocumentOptions documentOptions = default(JsonDocumentOptions), CancellationToken cancellationToken = default(CancellationToken))
{
<ParseAsync>d__108 stateMachine = default(<ParseAsync>d__108);
stateMachine.<>t__builder = AsyncTaskMethodBuilder<JsonNode>.Create();
stateMachine.utf8Json = utf8Json;
stateMachine.nodeOptions = nodeOptions;
stateMachine.documentOptions = documentOptions;
stateMachine.cancellationToken = cancellationToken;
stateMachine.<>1__state = -1;
stateMachine.<>t__builder.Start(ref stateMachine);
return stateMachine.<>t__builder.Task;
}
public string ToJsonString([System.Runtime.CompilerServices.Nullable(2)] JsonSerializerOptions options = null)
{
JsonWriterOptions options2 = default(JsonWriterOptions);
int defaultBufferSize = 16384;
if (options != null) {
options2 = options.GetWriterOptions();
defaultBufferSize = options.DefaultBufferSize;
}
PooledByteBufferWriter bufferWriter;
Utf8JsonWriter utf8JsonWriter = Utf8JsonWriterCache.RentWriterAndBuffer(options2, defaultBufferSize, out bufferWriter);
try {
WriteTo(utf8JsonWriter, options);
utf8JsonWriter.Flush();
return JsonHelpers.Utf8GetString(bufferWriter.WrittenMemory.Span);
} finally {
Utf8JsonWriterCache.ReturnWriterAndBuffer(utf8JsonWriter, bufferWriter);
}
}
public override string ToString()
{
if (this is JsonValue) {
JsonValuePrimitive<string> jsonValuePrimitive = this as JsonValuePrimitive<string>;
if (jsonValuePrimitive != null)
return jsonValuePrimitive.Value;
JsonValueOfElement jsonValueOfElement = this as JsonValueOfElement;
if (jsonValueOfElement != null && jsonValueOfElement.Value.ValueKind == JsonValueKind.String)
return jsonValueOfElement.Value.GetString();
}
JsonWriterOptions options = default(JsonWriterOptions);
options.Indented = true;
PooledByteBufferWriter bufferWriter;
Utf8JsonWriter utf8JsonWriter = Utf8JsonWriterCache.RentWriterAndBuffer(options, 16384, out bufferWriter);
try {
WriteTo(utf8JsonWriter, null);
utf8JsonWriter.Flush();
return JsonHelpers.Utf8GetString(bufferWriter.WrittenMemory.Span);
} finally {
Utf8JsonWriterCache.ReturnWriterAndBuffer(utf8JsonWriter, bufferWriter);
}
}
public abstract void WriteTo(Utf8JsonWriter writer, [System.Runtime.CompilerServices.Nullable(2)] JsonSerializerOptions options = null);
}
}