【问题标题】:WebAPI accepts different value for integerWebAPI 接受不同的整数值
【发布时间】:2017-02-06 12:26:53
【问题描述】:

我开发了接受类和 post 方法类型的 WebAPI。我在这里面临着非常奇怪的情况。

我在下面发布为 json。

{
 "MessageID":"fec41da8-655c-4532-af7d-554e1505a663",
 "Number":0009,
}

在方法中,我收到的 Number 为 0 - 但如果我将 0001 传递给 0008 - 它工作正常,我收到的其他号码为 8。只有 0009 会转换为其他值的 0,它会删除其他 0。

0002 receives as 2
0009 receives as 0

有什么想法吗?

【问题讨论】:

  • AFAIK,以零开头的数字不是有效的 JSON 数值。我会尝试修复这些值,而不是制定 ASP.NET Web API 来接受它们。
  • 如果直到 7 的所有内容都正常工作,那是因为解释为 0008/0009 的八进制数将失败,因为它们不是有效的八进制数(前导零是八进制符号在 JS 中)。这不是 json 的有效值,您不能简单地不提交带有前导零的值或将它们视为字符串吗?
  • 是的,我可以,但我只是想知道它是如何工作的,所以我可以改变一种方法并解决。在我的请求中 - 仅收到 0 的响应,那么我该如何更改前导 0?
  • @AlexK。似乎规范没有涵盖八进制数,而解析器可能能够处理它们......
  • 如果没有提及,那么我会说它不支持,var i = 0100 在 js 中是 64,所以存在歧义,例如 JSON.parse 将在数字中的前导零上失败。跨度>

标签: c# json asp.net-web-api data-conversion


【解决方案1】:

我在这里发现的原因是您的JSON无效 JSON

{
    "MessageID":"fec41da8-655c-4532-af7d-554e1505a663",
    "Number":0009,
}

有效的 JSON 将是

{
  "MessageID": "fec41da8-655c-4532-af7d-554e1505a663",
  "Number": "0009"
}

如果您将使用我在此处显示的有效JSON,那么您可以轻松地将其序列化为类的对象

public class Test
{
    public Guid MessageId { get; set; }
    public int Number { get; set; }
}

我已经针对WEB API 2.0 对其进行了测试,它运行良好。

在方法中,我收到的 Number 为 0 - 但如果我将 0001 传递给 0008 - 它工作正常,我收到的其他号码为 8。只有 0009 会转换为其他值的 0,它会删除其他 0。

我没有发现上面的行是正确的,因为如果我使用你的 JSON,我在每种情况下都会得到 0,即使它的编号在 0001 to 0008 or 0009 之间。

【讨论】:

    【解决方案2】:

    我们可以重写 json 格式转换函数来处理这些值。

    long value2 = text2.StartsWith("0x", StringComparison.OrdinalIgnoreCase) ? 
                  Convert.ToInt64(text2, 16) : 
                  Convert.ToInt64(text2, 8); // Here OCTAL!!!
    

    【讨论】:

    • 它是作为数字发送的,而不是作为字符串发送的,而且肯定不是以0x开头的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 2019-10-05
    相关资源
    最近更新 更多