public static void WriteErrorDetailsResponseJson(this HttpContext Context, ErrorDetails errorDetails) { Context.Response.ContentType = "application/json"; using Utf8JsonWriter writer = new System.Text.Json.Utf8JsonWriter(Context.Response.BodyWriter); writer.WriteStartObject(); foreach (var item in errorDetails.GetType().GetProperties()) { writer.WritePropertyName(item.Name); if (item.PropertyType == typeof(int)) { writer.WriteNumberValue((int)item.GetValue(errorDetails)); } else if (item.PropertyType == typeof(string)) { writer.WriteStringValue(item.GetValue(errorDetails).ToString()); } } writer.WriteEndObject(); writer.Flush(); }
/// <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.Any()) { RecursionStackFrame currentFrame = recursionStack.Peek(); recursionStack.Pop(); 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 enumerator 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 enumerator to keep items order: foreach (JsonNode item in jsonArray.Reverse()) { recursionStack.Push(new RecursionStackFrame(null, item)); } 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(); }