将JSON整数和浮点数转换为字符串

时间:2016-01-26 06:56:24

标签: php json regex pcre

我想预先解析JSON并将整数和浮点值转换为JSON中的字符串。 JSON中也有一些字符串值。

例如:

{
    "first_name": "sample",
    "last_name": "lastname",
    "integer" : 100,
    "float" : 1555.20
}

我只是使用here中的preg_replace()

echo preg_replace('/\: *([0-9]+\.?[0-9e+\-]*)/', '"\\1"', $jsonString);

但如果我的数组中有一个字符串值,它就不起作用,只有在数组中只有整数和浮点值时它才有效。

任何人都可以帮忙解释为什么会这样吗?

2 个答案:

答案 0 :(得分:2)

这是解决方案:

$str = '{"first_name":"sample",
          "last_name": "lastname",
          "integer" : 100,
          "float" : 1555.20,
          "createddate":"2015-06-25 09:57:28"}';

$result = preg_replace("/(\"\w+\":\s*?)(\d+\.?[^,\}]*\b)/imu",'$1"$2"',$str);

var_dump($result);
// output:
string(121) "{"first_name":"sample",
"last_name": "lastname",
"integer" : 100,
"float" : 1555.20,
"createddate":"2015-06-25 09:57:28"}"

答案 1 :(得分:1)

这听起来像是lookaheads and lookbehinds的工作!

$newJson = preg_replace('/("\s*:\s*)(?<!")[\d\.]+(?!")/', '\1"\2"', $json);

您可以将此here可视化。

(?<!")是负面的背后隐藏。它是一个“零长度表达式”,意味着它实际上不匹配一个字符;如果"存在,它只会阻止匹配发生。 (?!")是一个负向前瞻,并以相同的方式工作,但匹配向前而不是向后。