<PackageReference Include="System.Text.Json" Version="9.0.5" />

JsonNode

public abstract class 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); } }