Robot Framework 发送 JSON 时提示大整数无法解析为 Int32,如何处理?
结论
2412053228149000107 超出了 Int32 的取值范围。报错表明,接口在反序列化请求时尝试将这个值解析为 Int32,因此失败。
JSON 可以表达这个数字,但接收端的字段类型必须能够容纳它。如果接收端仍按 Int32 解析,仅在客户端把数字转成字符串通常无法解决问题。
现有日志没有指出具体字段,不能直接认定是 ProductId 或 PricingPlanId,需要结合实际请求和接口字段定义定位。
为什么转成字符串后仍然报错?
错误发生在 SubmitChangeOfServiceOrderRequest 的反序列化过程中,关键信息是:
The value '2412053228149000107' cannot be parsed as the type 'Int32'.
Int32 是有符号 32 位整数,范围为:
-2147483648 ~ 2147483647
报错中的值远大于上限。即使请求改成字符串形式:
{
"ProductId": "2412053228149000107"
}
如果接收端仍要求该字段为 Int32,它可能尝试将字符串中的数字转换为整数,最终因越界而失败。另一些反序列化器会直接拒绝字符串类型,具体行为取决于接口实现。
JSON 格式有效,或客户端能够解析 JSON,都不能证明请求符合服务端的数据契约。
先检查最终请求和字段定义
排查时要查看替换后的 JSON 和实际发送的请求体,不能只看模板文件。
可以在现有流程中加入日志。下面的代码使用 Robot Framework 的多空格分隔格式:
${remove_offer_payload}= Get File RemoveOffer.json
${str_payload}= Replace Variables ${remove_offer_payload}
Log ${str_payload}
${payload}= Convert String To Json ${str_payload}
运行这些关键字前,需要导入相应的库。日志中如有敏感信息,应先脱敏。
检查以下内容:
2412053228149000107实际出现在哪些字段中,是否也出现在未展示的请求部分。- 对应字段在接口文档或服务端请求模型中被定义为什么类型。
- 最终发送的是否为预期的 JSON 对象,以及后续发送步骤是否发生了类型转换。
不要将所有字段都替换为同一个大整数来验证。这可能导致原本正常的 Int32 字段越界,使问题更难定位。保留其他字段的有效值,逐个检查可疑字段。
根据接口契约选择处理方式
接口要求 Int32
如果该字段只能接收 Int32,客户端必须提供范围内且符合业务含义的值。
确认是否传错了标识符,例如把另一个系统的长编号填入了当前字段。不要通过截断、取模或随意缩小数字来绕过错误,否则可能指向错误的数据。
如果业务需要传递这个长编号,就需要接口提供方调整字段定义或提供合适的字段。
接口需要接收大整数
2412053228149000107 在有符号 64 位整数的范围内。若接口支持修改,可以考虑将相关字段改为 Int64,在 C# 中对应 long。
例如,只有确认 ProductId 是出错字段,且它的业务定义为整数时,才可能将服务端字段调整为:
public long ProductId { get; set; }
客户端随后按接口要求发送 JSON 数字:
{
"RemoveItems": [
{
"ProductId": 2412053228149000107
}
]
}
这只是字段示例。实际请求仍需保留接口要求的其他字段,服务端后续的数据模型和存储也必须支持该范围。
字段属于标识符,接口支持字符串
如果字段表示编号,不参与数值运算,并且接口契约允许字符串,可以用字符串传递:
{
"RemoveItems": [
{
"ProductId": "2412053228149000107"
}
]
}
服务端也需要按字符串接收和处理。仅给 JSON 值加上引号,不会改变服务端的字段类型。
这个值还超过了 JavaScript Number 的安全整数上限 9007199254740991。如果请求链路经过使用 Number 处理数字的 JavaScript 代码,需要防止精度丢失;允许使用字符串的标识符可以从源头保持为字符串。
检查 Robot Framework 的变量占位符
原模板使用了:
"ProductId": "{{ProductId}}"
Robot Framework 标准的 Replace Variables 使用 ${ProductId} 这样的变量语法。{{ProductId}} 通常是其他模板引擎的写法;如果没有额外的模板处理步骤,它不会被当作标准 Robot Framework 变量替换。
如果接口要求字符串,模板可写为:
{
"RemoveItems": [
{
"ProductId": "${ProductId}",
"PricingPlanId": "${PricingPlanId}"
}
]
}
如果接口要求数字,则相应占位符外不加引号,并确保变量替换后是合法的 JSON 数字:
{
"RemoveItems": [
{
"ProductId": ${ProductId},
"PricingPlanId": ${PricingPlanId}
}
]
}
第二种写法在替换前还不是合法 JSON,必须先替换变量,再调用 Convert String To Json。应根据各字段的实际契约选择模板,不能因为运行时的值有时是数字、有时是字符串,就假定接口同时接受这两种类型。
占位符问题和 Int32 越界需要分别处理:先确认模板替换正确,再确认最终值符合接收端的字段类型。
备注:内容仅供参考。
