示例#1
0
        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();
        }
示例#2
0
        /// <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();
        }