JSON_NUMERIC_CHECK和电话号码

时间:2014-07-02 00:00:35

标签: php json

我们的PHP API使用启用了JSON_NUMERIC_CHECK的json_encode输出结果,这对于财务数据,二进制值等很重要。但我们最近引入了一个电话号码字段,并且它在转换时从数字的开头删除零它是一个整数。

我试图强迫"(字符串)"在转到json_encode之前输入值,但看起来函数覆盖了它。例如:

$output = array(
    'is_bool' => 1,
    'total_amount' => '431.65',
    'phone_number' => (string) '0272561313'
);
echo json_encode($output,JSON_NUMERIC_CHECK);

产地:

{"is_bool":1,"total_amount":431.65,"phone_number":272561313}

如何最好地处理这个问题的任何建议将非常感激。我真的不想在电话号码的末尾添加尾随空格,只是为了让它以字符串形式输出。

谢谢!

7 个答案:

答案 0 :(得分:7)

不是将其类型转换为字符串,而是执行以下操作:

$output = array(
    'is_bool' => 1,
    'total_amount' => '431.65',
    'phone_number' => '"0272561313"' // add quotations
);

echo '<pre>';
echo json_encode($output,JSON_NUMERIC_CHECK | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT);

它保持尾随零:

{
    "is_bool": 1,
    "total_amount": 431.65,
    "phone_number": "\"0272561313\""
}

解码:

$test = json_encode($output,JSON_NUMERIC_CHECK | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT);
$test = json_decode($test, true);
print_r($test);

输出:

Array
(
    [is_bool] => 1
    [total_amount] => 431.65
    [phone_number] => "0272561313"
)

答案 1 :(得分:3)

你可以试试这个:

{
  "is_bool": 1,
  "total_amount": 431.65,
  "phone_number": "xn#0272561313"
}

作为mysql中的示例: 选择CONCAT(&#39; xn#&#39;,phone_number)作为phone_number ......

如果您使用json_encode(),请替换如下字符串:

echo str_replace('xn#','',$your_encoded_json);

答案 2 :(得分:1)

电话号码有同样的问题,这会遍历一个数组(没有对象!),只将不以0或+开头的数值转换为int或float。

        array_walk_recursive($json, function (&$value, $key)
        {
            if(is_string($value) && is_numeric($value))
            {
                // check if value doesn't starts with 0 or +
                if(!preg_match('/^(\+|0)/', $value))
                {
                    // cast $value to int or float
                    $value   += 0;
                }
            }
        });

        return json_encode($json);

答案 3 :(得分:0)

将数据传递给此函数以获取JSON编码,其中+和0保留在字符串之前。我正在使用双重编码和str_replace来解决问题。

public static function json_encode($data){
    $numeric = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK);
    $nonnumeric = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
    preg_match_all("/\"[0\+]+(\d+)\"/",$nonnumeric, $vars);
    foreach($vars[0] as $k => $v){
        $numeric = preg_replace("/\:\s*{$vars[1][$k]},/",": {$v},",$numeric);
    }
    return $numeric;
}

答案 4 :(得分:0)

您无需使用

  

JSON_NUMERIC_CHECK

改为使用属性广播

https://laravel.com/docs/5.1/eloquent-mutators#attribute-casting

    class SomeModel extends Model
    {
        protected $casts = [
            'field_name' => 'array',
 'status' => 'boolean'
        ];
    }

答案 5 :(得分:0)

为我工作:

// $DATAS -> datas returned by the server
$DATAS = array(
    array('tel' => '0606060606'), 
    array('tel' => '0707070707') 
);

foreach($DATAS as $k => $v){

    $tel = " ".$v['tel']." ";  // ADD WHITE SPACE
    $DATAS[$k]['tel'] = $tel;
}

echo json_encode($DATAS, JSON_NUMERIC_CHECK);

//输出:[{“ tel”:“ 0606060606”},{“ tel”:“ 0707070707”}]

也许在JSON编码中定义CSS空白或修剪数据 获得完美的解析数字

答案 6 :(得分:-1)

对于它的价值,我遇到了类似的问题,因为我的国际电话号码以+符号开头。我在我的电话号码字符串上使用urlencode来解决问题:

$phone = urlencode( $phone );