如何有效地从 C# 中的流中获取 JSON 正文?

How to get JSON body from the stream in C# efficiently?

我正在使用 Utf8 json 库使用 JsonSerializer class 的 DeserializeAsync 方法反序列化我的 JSON。有时我看到它抛出异常 -

Arithmetic operation resulted in an overflow.

所以看起来我的 JSON 数据的值太大而无法放入我们对象的属性之一,从而导致此溢出异常。下面是我在尝试打印 json 时得到的代码,它很糟糕并导致此 Arithmetic Overflow 错误,但它不会在发生此异常时记录 JSON。

using (var content = httpResponseMessage.Content)
{
    if (content == null) return (default(T), statusCode);

    using (var responseStream = await httpResponseMessage.Content.ReadAsStreamAsync())
    {
        try
        {
            deserializedValue = await JsonSerializer.DeserializeAsync<T>(responseStream, formatResolver);
        }
        catch (Exception ex)
        {
            var bodyString = (ex as JsonParsingException)?.GetUnderlyingByteArrayUnsafe();
            var error = (bodyString != null) ? $"Bad json: {Encoding.UTF8.GetString(bodyString)}" : "Cannot Deserialize JSON";
            logger.logError(error, ex.Message, "Deserialization Exception", ex.StackTrace, (int)statusCode);
            return (default(T), HttpStatusCode.BadRequest);
        }
    }
}

出于某种原因,只要发生此异常,bodyString 就会变为 null,这就是为什么我的条件没有得到评估以获得 JSON 正文的原因。我的理解是它会抛出 JsonParsingException 但看起来它会抛出一些其他异常。

每当发生这种异常时,有什么方法可以获取 JSON 正文吗?或者以更好的方式编写此代码,以便在有效发生此异常时获得 JSON?

  1. 你写道你遇到了“算术溢出”错误,所以 catch 中的实际异常类型可能是 OverflowException,而不是 JsonParsingException

  2. 我认为你应该从 responseStream 得到 bodyString。您可以使用 responseStream.Position = 0 重置流并从中读取主体作为字节数组。