如何有效地从 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?
你写道你遇到了“算术溢出”错误,所以 catch 中的实际异常类型可能是 OverflowException
,而不是 JsonParsingException
我认为你应该从 responseStream
得到 bodyString
。您可以使用 responseStream.Position = 0
重置流并从中读取主体作为字节数组。
我正在使用 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?
你写道你遇到了“算术溢出”错误,所以 catch 中的实际异常类型可能是
OverflowException
,而不是JsonParsingException
我认为你应该从
responseStream
得到bodyString
。您可以使用responseStream.Position = 0
重置流并从中读取主体作为字节数组。