将输入转换为随机整数的 Web API



不确定主题是否是此问题的最佳描述,但我遇到了一个不寻常的问题,其中我有一个 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; }
    }

相关内容

  • 没有找到相关文章

最新更新