JSON不能被解析为Int32类型
在Robot Framework发送POST时我遇到了这个错误:
Message: There was an error deserializing the object of type ContentDirect.CoreService.Contract.Message.SubscriberManagement.SubmitChangeOfServiceOrderRequest. The value '2412053228149000107' cannot be parsed as the type 'Int32'.
我直接把变量保存在JSON中并在运行时更新它们,这可能相关,所以这是我用来把变量替换进JSON的代码
${remove_offer_payload}= Get File RemoveOffer.json
${str_payload}= Replace Variables ${remove_offer_payload}
${payload}= Convert String To Json ${str_payload}
我这样做是因为我想让我JSON的格式如下,然后再替换成正确的值
{
"RemoveItems": [
{
"ProductId": "{{ProductId}}",
"PricingPlanId": "{{PricingPlanId}}"
}
]
}
我尝试把所有变量替换成错误中的数字,但没有任何变化,有时这些字段是数字,有时是字符串,将所有数字都转换成字符串也没有改变任何东西。
如何让这个JSON处理那些数字?
解决方案
我不知道在这些约束下你期望如何取得任何进展。
你基本上是在对 n = 2_412_053_228_149_000_107 做了一个Python赋值,把它序列化为JSON,然后又试图使用一个将整数限制为 uint32_t 表示的JSON解析器来回传。是的,这行不通。
在十六进制中,n 是 0x 2179 55A1 A327 C7AB。现在 0x2179 55A1 可以被压缩到32位之内。0xA327 C7AB 也可以。但你原来的 n 在我看来像是一个64位的数量。Python的“batteries included”内置库 import json 可以轻松处理你那2.4×10^18的数量级,甚至更大的数字。但那不是你选择使用的那一个JSON解析器。
让我们看规范:
This specification allows implementations to set limits on the range and precision of numbers accepted.
你使用的库是否因为仅支持32位整数而存在代码缺陷?不,它很好地实现了JSON规范。但你使用它的方式不对,未遵守其文档所述的32位限制。
最好传递被引号包裹的 str(2412053228149000107),然后在此基础上调用 int(),或者更倾向于使用一个更强大的库,例如与你的Python解释器一起提供的那个库 the one。