如何检查json编码的字符串?

时间:2014-01-02 17:51:16

标签: php json

我发现很多人都使用这样的功能......

function isJson($string) {
    json_decode($string);
    return (json_last_error() == JSON_ERROR_NONE);
}

(来自Fastest way to check if a string is JSON in PHP?

许多json编码字符串包含这些字符{ : , "

如果我检查包含这些字符的字符串,它可能会返回true。

示例:

$var = '{"1":"a2","a2":{"1":"a2.2","2":"a2.2"}}';
var_dump(isJson($var)) // true;

但是当我检查只是一个数字的字符串时,它也会返回true。

示例:

$phone = '021234567';
var_dump(isJson($phone)); // true

我认为字符串'021234567'不是json编码的,它应该返回false。


让我们看一些更清晰问题的例子。

$var1 = '021234567'; // this is string. not integer. NOT json encoded.
$var2 = '"021234567"'; // this is json encoded.
$var3 = 021234567; // this is integer. NOT json encoded.
$var4 = 'bla bla'; // this is string. NOT json encoded.
$var5 = '{"1":"a2","a2":{"1":"a2.2","2":"a2.2"}}'; // this is json encoded.

var_dump(isJson($var1));
var_dump(isJson($var2));
var_dump(isJson($var3));
var_dump(isJson($var4));
var_dump(isJson($var5));

结果是:

true
true
true
false
true

但预期的结果是:

false
true
false
false
true

问题是。 如何检查有效json编码的字符串?


更多示例2

如果021234567是整数。当我使用json_encode时,它返回整数,并在使用json_decode时再次与它无关

$var = 021234567;
echo $var; // 4536695
echo json_encode($var); // 4536695
echo json_decode(4536695); // 4536695
echo json_decode($var); // 4536695

$var = 21234567;
echo $var; // 21234567
echo json_encode($var); // 21234567
echo json_decode(4536695); // 21234567
echo json_decode($var); // 21234567

所以,当我用isJson函数检查json编码的字符串时,整数值应该返回false。但事实并非如此。

如果021234567是字符串。当我使用json_encode时,我应该得到“021234567”(双引号)。如果此字符串没有双引号,则不应对其进行json编码。

$var = '021234567';
echo $var; // 021234567
echo json_encode($var); // "021234567"
echo json_decode('"021234567"'); // 021234567
echo json_decode($var); // 21234567

// example if string is text with double quote in it.
$var = 'i"m sam';
echo $var; // i"m sam
echo json_encode($var); // "i\"m sam"
echo json_decode('"i\"m sam"'); // i"m sam
echo json_decode($var); // null

如你所见。带有json编码的简单字符串在该字符串的打开和关闭时应至少包含双引号字符。

请帮助我如何检查字符串是否有效json编码

我认为有效的json编码字符串在该字符串的打开和关闭时应至少具有双引号"或卷曲bracket {}

我不知道如何检查或不知道如何preg_match。

1 个答案:

答案 0 :(得分:0)

来自PHP Documentation

  

PHP实现了JSON的超集 - 它还将编码和解码标量类型和NULL。 JSON标准仅在嵌套在数组或对象中时才支持这些值。

因此,前导零进行此检查的原因是json_decode只是在解析过程中剥离它们而不会出现任何错误。例如:

echo json_decode('0123');

只会显示123