PAYATHON 2026

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}

运行这些关键字前,需要导入相应的库。日志中如有敏感信息,应先脱敏。

检查以下内容:

  1. 2412053228149000107 实际出现在哪些字段中,是否也出现在未展示的请求部分。
  2. 对应字段在接口文档或服务端请求模型中被定义为什么类型。
  3. 最终发送的是否为预期的 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 越界需要分别处理:先确认模板替换正确,再确认最终值符合接收端的字段类型。

备注:内容仅供参考。