17370845950

如何正确处理 PHP 中 JSON 输出的数值类型(避免字符串化数字)

本文讲解如何在调用 api 时确保 json 数据中数字字段(如 stock.value)以整型而非字符串形式输出,核心是使用 intval() 显式转换用户输入,防止 json_encode 自动将数字转为字符串。

在 PHP 构建 API 请求体时,一个常见却容易被忽视的问题是:用户通过表单(如 $_POST['stoc'])提交的值始终是字符串类型。即使输入的是纯数字(例如 200),PHP 也会将其作为字符串 "200" 存储。当该值参与 json_encode() 序列化时,它将被原样输出为 JSON 字符串 "value": "200",而非期望的数字 "value": 200。

要解决这个问题,必须在构建 $payload 数组前,对所有应为数值的字段进行显式类型转换。推荐使用 intval()(适用于整数)或 (float) 强制转换(适用于小数),而非依赖自动类型推断。

以下是你原始代码中关键部分的修正示例:

$payload[] = [
    "id"              => $id,
    "locale"          => "RO",
    "hidden"          => 0,
    "currency"        => "RON",
    "brand"           => "Decorepublic",
    "name"            => $nume,
    "category_id"     => 10008,
    "status"          => "1",
    "vat"             => "0", 
    "stock"           => [[
        "warehouse_id" => 1,
        "value"        => intval($stoc), // ✅ 关键修复:强制转为整数
    ]],
    "sale_price"      => floatval($pret),   // ✅ 同理,价格建议用 floatval
    "rrp"             => floatval($rrp),
    "description"     => $nume,
    "images"          => array_filter([ // ✅ 建议过滤空 URL,提升健壮性
        ["url" => $url],
        ["url" => $url1],
        ["url" => $url2],
        ["url" => $url3],
    ], function($img) { return !empty($img['url']); }),
];

⚠️ 注意事项:

  • intval("200") 返回 200(int),而 intval("200.9") 会截断为 200;若需保留小数,请改用 floatval($stoc) 或 filter_var($stoc, FILTER_VALIDATE_FLOAT);
  • 不要使用 (int)$stoc 替代 intval() —— 二者行为基本一致,但 intval() 更语义清晰且支持进制参数(本例无需);
  • http_build_query(["data" => json_encode($payload)]) 是可行的,但更规范的做法是直接发送 JSON 格式请求体(设置 Content-Type: application/json 并传入 json_encode($payload)),不过需确认目标 API 是否接受该格式;
  • print $stoc 输出 1 是因为 print 返回布尔值(成功返回 1),并非 $stoc 的值——调试请用 var_dump($stoc) 或 echo $stoc;。

总结:JSON 中的数字类型由 PHP 变量的底层类型决定

,而非其内容外观。只要确保 $stoc、$pret 等变量在写入 $payload 时已是整型/浮点型,json_encode() 就会生成无引号的原生数值,从而满足 API 对数据格式的严格要求。