使用 JsonDocument 保留原始文档的格式

Persist formatting of original document with JsonDocument

环境 .net 6 最小 api

app.MapPost("/HandleStatusUpdate", async (System.Text.Json.JsonDocument jsonBody, [FromServices] IMediator mediator, Microsoft.AspNetCore.Http.HttpContext context) =>

我正在接受来自各种来源的 webhook 请求,并且需要根据我从发送请求的每个服务获得的静态密钥(静态密钥 + 消息 = 请求 header sha 值)验证消息.

我遇到的问题是,当我将 Json 文档转换为字符串时:

 using (var stream = new MemoryStream())
        {
            var writer = new Utf8JsonWriter(stream);
            jdoc.WriteTo(writer);
            writer.Flush();
            return Encoding.UTF8.GetString(stream.ToArray());
        }

这不是 re-creating 发送的确切消息(它删除了空格),因此验证步骤失败。我已经验证,如果我接收发送的原始消息并 运行 通过验证步骤,它确实有效。

这是一个正在发送的 JSON 字符串,内容类型为 application/json。因为,我接受来自各种来源的东西,我无法创建一个我可以序列化的 class。

我不认为有什么方法可以让 JsonDocument 保持传入的 Json 文档的格式,那么有没有更好的方法来处理这个问题?

您可以使用 JsonDocument.RootElement.GetRawText() 获取具有原始格式的原始 JSON。来自 docs:

JsonElement.GetRawText Method

Gets a string that represents the original input data backing this value.

因此,您可以这样做:

return jdoc.RootElement.GetRawText();

演示 fiddle here.