不确定主题是否是此问题的最佳描述,但我遇到了一个不寻常的问题,其中我有一个 Web API 操作和一个请求上的单个字段,并且由于某种奇怪的原因,该值纵。根据输入,这会被 Web API 转换/转换,甚至由其他东西(如 JSON.NET)转换/转换?
应该提到这是一个全新的项目,除了在 Visual Studio 中创建新的 Web API 项目时默认添加的内容外,没有其他引用。
public class TestController : ApiController
{
public void Post(Foo request)
{
}
}
public class Foo
{
public string Blah { get; set; }
}
使用休息客户端,我使用以下请求命中了操作:
{
"Blah": 43443333222211111117
}
调试时,Blah 的值将转换为 "6549845074792007885"
。我不明白它是如何以及为什么这样做的?它尊重的任何其他价值。例如:
{
"Blah": 53443333222211111117
}
这绝对没问题,但数字更大。
谢谢,DS。
更新
此错误已修复,并计划包含在下一个版本中。
原始答案
正如所暗示的那样,这是 JSON.NET 中的一个错误,但它并不像最初看起来那么简单。
5.0.4 之前的版本适用于这两个测试用例。之后的任何事情似乎都失败了,但仅适用于第一个奇怪的测试用例。我已经浏览了一些 JSON.NET 代码,试图看看这种混淆发生在哪里,但目前无法弄清楚为什么会这样,我需要做更多的挖掘。
2147483647 国际最大4444333322221111有效的信用卡号格式9223372036854775807 国际 64 最大值43443333222211111117 狡猾的数字大于 Int 64,因此溢出53443333222211111117 比上面和 Int 64 大,但工作奇怪。1.7976931348623157E+308。 十进制最大值
为什么53443333222211111117有效是非常奇怪的。 JSON.NET 似乎有一个 1025 个字符的缓冲区,其中包含我的测试用例的大量乱码,最终数字被错误读取。我将进一步检查这一点,并向 JSON.NET 提出一个问题。
如果对属性使用小数,这将适用于前导数字不为零的所有情况,但这不是解决方案。短期内,请使用版本 5.0.3。
以此示例程序演示问题。
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Sending in: n43443333222211111117");
var largeBrokenNumber = JsonConvert.DeserializeObject<Foo>("{"Blah": 43443333222211111117 }");
Console.WriteLine(largeBrokenNumber.Blah);
Console.WriteLine();
Console.WriteLine("Sending in: n53443333222211111117");
var largeOddWorkingNumber = JsonConvert.DeserializeObject<Foo>("{"Blah": 53443333222211111117 }");
Console.WriteLine(largeOddWorkingNumber.Blah);
}
}
public class Foo
{
public string Blah { get; set; }
}