【问题标题】:How to get JSON body from the stream in C# efficiently?如何有效地从 C# 中的流中获取 JSON 正文?
【发布时间】:2020-11-10 19:25:20
【问题描述】:

我正在使用 Utf8 json 库使用 DeserializeAsync 类的 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?

【问题讨论】:

    标签: c# json deserialization utf8json


    【解决方案1】:
    1. 您写道您遇到了“算术溢出”错误,因此 catch 中的实际异常类型可能是 OverflowException,而不是 JsonParsingException

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

    【讨论】:

    • 感谢您的第 1 点,我会看一看,但对您的第 2 点感到困惑。您能否提供一个如何有效执行此操作的示例?
    • 您可以使用 MemoryStream。该技术在stackoverflow.com/questions/221925/… 中进行了描述。
    猜你喜欢
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 2020-04-18
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多