【发布时间】:2017-12-29 21:38:24
【问题描述】:
在将一些 JSON 反序列化为 C# 对象时,我的 Int32 属性之一开始出现 System.OverflowException:值太大或太小。我能够将有问题的 json 保存到文件中以进一步检查它并在单元测试中重现错误。真的不应该有这么大或小的价值进来;我需要找到具有这个大值的特定 JSON 属性(以使基础属性变长)。问题是大约有 5000 行要排序。
根据我的研究,Visual Studio Find RegEx 似乎不太适合这种情况,因为它们似乎不大于或小于运算符。在此文件中搜索大于 2147483647 的值的最佳方法是什么?
示例 Json:
"id": "pmanc",
"operation": "UPDATE",
"ResourceIAQStats": {
"resourceId": "pmanc",
"resourceName": "Peter Manc",
"resourceState": 7,
"durationInStateMillis": 113888,
"nHandledContacts": 68,
"nPresentedContacts": 68,
"avgTalkDuration": 181324,
编辑
这是我解析 JSON 的 C# 方法,尝试将 JArray Children 反序列化为通用对象时发生溢出异常。 Newtonsoft 没有指定哪个对象(或属性)太大。
public async Task<List<T>> GetStatsAsync<T>(string testJson)
{
var requestResult = JArray.Parse(testJson);
return new List<T>(requestResult.Children()
.Select(jo => jo[typeof(T).Name].ToObject<T>()));
}
【问题讨论】:
-
为什么不直接吐出关于对象的其他信息,比如 ID?它会在出现异常之前记录 ID,然后你就会找到罪魁祸首。
-
@BrandonMiller:这样做可能需要修改库代码。
-
@BenVoigt 我不确定你的意思。你可以在大约 10 分钟或更短的时间内在控制台应用程序中模拟类似的东西。只需逐个迭代您的对象并尝试反序列化它。至少,您至少会在违规对象之前找到对象。
-
您是否从 Newtonsoft 收到错误消息?通常,罪犯会在例外中的某处列出。您是否在捕获内部异常?
-
@BrandonMiller:为此,您需要编写一个能够将 JSON 分离为其各个对象的解析器...
标签: c# json visual-studio visual-studio-2015