使用JSON_NUMERIC_CHECK在json_encode()中排除某些值

时间:2017-03-16 16:20:04

标签: php json

我使用CakePHP框架。我有一个对应模型记录的数组。我必须处理它,所有的整数和浮点数输出为整数和浮点数就像在没有引号的{(11111.1而不是此'111.1'或{{ 1}})。我找到了以这种方式返回所有值的方法:'11.1'。问题是:有没有办法以这种方式排除某些数字字段?换句话说:我有两个数字字段:return json_encode($data, JSON_NUMERIC_CHECK);field1,它们必须带引号。同时所有其他数字字段必须没有引号。我怎么能实现这个? 我的数组看起来如此:

field2

2 个答案:

答案 0 :(得分:1)

首先,一个关于JSON_NUMERIC_CHECK如何运作的小例子:

$data = [112, '34', 5.6, '7.8'];
echo json_encode($data) . PHP_EOL;
echo json_encode($data, JSON_NUMERIC_CHECK) . PHP_EOL;

... prints

[112,"34",5.6,"7.8"]
[112,34,5.6,7.8]

没有任何功能可以确定应该解析哪些值(如果他们想要添加它,它的语法是什么?)。获得所需结果的唯一方法是确保源数据已经使用了适当的PHP数据类型。这是你当然可以做的事情(虽然确切的细节取决于你的规格):

$person = [
   'age' => 33,
   'zip_code' => '09007',
];
$person['age'] = is_null($person['age']) ? null : (int)$person['age'];
echo json_encode($person);

...打印:

{"age":33,"zip_code":"09007"}

答案 1 :(得分:0)

此问题的另一个解决方案,如果它足够重要,您可以以健壮的方式解决它,那就是使用JMS Serializer library.

您需要为您的数据定义一个类,但在此之后,您在序列化过程中将遵循通过注释定义的任何类型。

据说,阿尔瓦罗的帖子表明,铸造将起作用。所以,这样的事情也应该有效:

// Fix all Numerics
$data = json_decode(json_encode($data, JSON_NUMERIC_CHECK), true);
// Fix your 2 strings

$callback = function($row) {
    if (array_key_exists('field1', $row)) {
        $row['field1'] = (string)$row['field1'];
    } 

    if (array_key_exists('field2', $row)) {
        $row['field2'] = (string)$row['field2'];
    } 
    return $row;
}

$data = array_map($callback, $data);
// This should be ready for final encode

return json_encode($data);