/// <summary> /// Writes this instance to provided writer. /// </summary> /// <param name="writer">Writer to wrtire this instance to.</param> public void WriteTo(Utf8JsonWriter writer) { var recursionStack = new Stack <RecursionStackFrame>(); recursionStack.Push(new RecursionStackFrame(null, this)); while (recursionStack.TryPop(out RecursionStackFrame currentFrame)) { if (currentFrame.PropertyValue == null) { // Current object/array is finished. // PropertyValue is null, so we need to check ValueKind: Debug.Assert(currentFrame.ValueKind == JsonValueKind.Object || currentFrame.ValueKind == JsonValueKind.Array); if (currentFrame.ValueKind == JsonValueKind.Object) { writer.WriteEndObject(); } if (currentFrame.ValueKind == JsonValueKind.Array) { writer.WriteEndArray(); } continue; } if (currentFrame.PropertyName != null) { writer.WritePropertyName(currentFrame.PropertyName); } switch (currentFrame.PropertyValue) { case JsonObject jsonObject: writer.WriteStartObject(); // Add end of object marker: recursionStack.Push(new RecursionStackFrame(null, null, JsonValueKind.Object)); // Add properties to recursion stack. Reverse enumerate to keep properties order: foreach (KeyValuePair <string, JsonNode> jsonProperty in jsonObject.Reverse()) { recursionStack.Push(new RecursionStackFrame(jsonProperty.Key, jsonProperty.Value)); } break; case JsonArray jsonArray: writer.WriteStartArray(); // Add end of array marker: recursionStack.Push(new RecursionStackFrame(null, null, JsonValueKind.Array)); // Add items to recursion stack. Reverse enumerate to keep items order: for (int i = jsonArray.Count - 1; i >= 0; i--) { recursionStack.Push(new RecursionStackFrame(null, jsonArray[i])); } break; case JsonString jsonString: writer.WriteStringValue(jsonString.Value); break; case JsonNumber jsonNumber: writer.WriteNumberValue(Encoding.UTF8.GetBytes(jsonNumber.ToString())); break; case JsonBoolean jsonBoolean: writer.WriteBooleanValue(jsonBoolean.Value); break; case JsonNull _: writer.WriteNullValue(); break; } writer.Flush(); } writer.Flush(); }