使用json_encode()处理带引号的数字

3

许多第三方公司强制我们使用非传统代码并生成非标准输出。

我们正在使用标准的json_encode()函数在JS/HTML中输出JSON变量,看起来像:

"custom":{"1":2,"2":7,"3":5}

现在他们告诉我们这种方式对他们不起作用,他们需要这样做:
"custom":{"1":"2","2":"7","3":"5"}

可以强制PHP在数字周围加上引号吗?也许在编码之前构建对象时使用强制转换(string)?主要是,我们需要以下选项位标志的相反情况:JSON_NUMERIC_CHECK (integer)
Encodes numeric strings as numbers. Available since PHP 5.3.3.
但我怀疑这并不存在。

这个问题与链接的问题不同,因为它没有考虑 json_encode() 把字符串转换回数字,参见 https://3v4l.org/YZS0F - Daniel W.
@mickmackusa 是的,但我不再需要解决方案了,因为我不再与不接受标准的人合作。请查看此 RFC,该 RFC 处理了相关情况:https://wiki.php.net/rfc/json_numeric_as_string - Daniel W.
2
你运行了一个糟糕的测试,不公正地取消了 dup 的锤定。 https://3v4l.org/S8nXc array_map() 不通过引用修改。 - mickmackusa
@mickmackusa 太棒了!感谢您指出我的错误! - Daniel W.
2个回答

3

我猜你需要自己修复这个问题。我想不到一个内置的函数,但是你可以编写自己的函数:

function stringify_numbers($obj) {
    foreach($obj as &$item)
        if(is_object($item) || is_array($item))
            $item = stringify_numbers($item); // recurse!
        if(is_numeric($item)
            $item = (string)$item;
    return $obj;
}

现在你可以使用 json_encode(stringify_numbers($yourObject)),这与IT技术有关。

stringify 不是一个有效的 PHP 函数,对吧?不过我理解你的概念,对我很有帮助。我本来希望有一个简单的位标志,总是添加引号 :( - Daniel W.
@DanFromGermany stringify 是一个打字错误。已经修复了。本意是递归的。 - nl-x
有一个本地函数可以递归迭代所有叶节点:array_walk_recursive()演示 - mickmackusa

1

如果您正在从一维数组构建 JSON 数据,您可以使用

echo json_encode(array_map('strval', $data));

这种技术会无条件地将所有值转换为字符串(包括对象、null、布尔值等)。
如果你的数据可能是多维的,那么你需要递归调用它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接