Web API 将输入转换为随机整数
Web API translating input into random int
不确定该主题是否是对此问题的最佳描述,但我遇到了一个不寻常的问题,我有一个 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。
更新
This bug has been fixed and is scheduled to be included in the next release.
原答案
正如所暗示的那样,这是 JSON.NET 中的一个错误,但它并不像最初看起来那么简单。
5.0.4 之前的版本适用于这两个测试用例。之后的任何事情似乎都失败了,但仅针对第一个奇怪的测试用例。我已经浏览了一些 JSON.NET 代码,试图看看这种混淆发生在哪里,但目前无法弄清楚为什么会这样,我需要做更多的挖掘。
2147483647 Int Max
4444333322221111 Valid Credit Card Number Format
9223372036854775807 Int 64 Max
43443333222211111117 Dodgy Number greater than Int 64 hence overflow
53443333222211111117 Larger than above and Int 64, but works oddly.
1.7976931348623157E+308. Decimal max
为什么 53443333222211111117 工作很奇怪。 JSON.NET 似乎预留了一个 1025 个字符的缓冲区,其中包含我的测试用例的大量乱码,最终数字被错误读取。我会进一步检查这个 raise an issue with 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; }
}
不确定该主题是否是对此问题的最佳描述,但我遇到了一个不寻常的问题,我有一个 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。
更新
This bug has been fixed and is scheduled to be included in the next release.
原答案
正如所暗示的那样,这是 JSON.NET 中的一个错误,但它并不像最初看起来那么简单。
5.0.4 之前的版本适用于这两个测试用例。之后的任何事情似乎都失败了,但仅针对第一个奇怪的测试用例。我已经浏览了一些 JSON.NET 代码,试图看看这种混淆发生在哪里,但目前无法弄清楚为什么会这样,我需要做更多的挖掘。
2147483647 Int Max 4444333322221111 Valid Credit Card Number Format 9223372036854775807 Int 64 Max 43443333222211111117 Dodgy Number greater than Int 64 hence overflow 53443333222211111117 Larger than above and Int 64, but works oddly. 1.7976931348623157E+308. Decimal max
为什么 53443333222211111117 工作很奇怪。 JSON.NET 似乎预留了一个 1025 个字符的缓冲区,其中包含我的测试用例的大量乱码,最终数字被错误读取。我会进一步检查这个 raise an issue with 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; }
}