在 PHP 中
解码 JSON 解码 JSON 就像对其进行编码一样简单。PHP 为您提供了一个方便的 json_decode 函数,可以为您处理所有事情。如果你只是将一个有效的 JSON 字符串传递给方法,你会得到一个 stdClass 类型的对象。这是一个简短的示例:
<?php
$string = '{"foo": "bar", "cool": "attr"}';
$result = json_decode($string);
// Result: object(stdClass)#1 (2) { ["foo"]=> string(3) "bar" ["cool"]=> string(4) "attr" }
var_dump($result);
// Prints "bar"
echo $result->foo;
// Prints "attr"
echo $result->cool;
?>
如果您想取回关联数组,请将第二个参数设置为 true:
<?php
$string = '{"foo": "bar", "cool": "attr"}';
$result = json_decode($string, true);
// Result: array(2) { ["foo"]=> string(3) "bar" ["cool"]=> string(4) "attr" }
var_dump($result);
// Prints "bar"
echo $result['foo'];
// Prints "attr"
echo $result['cool'];
?>
如果您期望一个非常大的嵌套 JSON 文档,您可以将递归深度限制在某个级别。如果文档比给定深度更深,该函数将返回 null 并停止解析。
<?php
$string = '{"foo": {"bar": {"cool": "value"}}}';
$result = json_decode($string, true, 2);
// Result: null
var_dump($result);
?>
最后一个参数的工作方式与 json_encode 中的相同,但目前只支持一个位掩码(它允许您将 bigints 转换为字符串,并且仅在 PHP 5.4 及更高版本中可用)。到目前为止,我们一直在使用有效的 JSON 字符串(除了从零深度错误)。下一部分将向您展示如何处理错误。
错误处理和测试
如果无法解析 JSON 值或找到比给定(或默认)深度更深的嵌套级别,则从 json_decode 返回 NULL。这意味着 json_encode/json_deocde 不会直接引发异常。
那么我们如何确定错误的原因呢?json_last_error 函数在这里有所帮助。json_last_error 返回一个整数错误代码,它可以是以下常量之一(取自此处):
JSON_ERROR_NONE:没有发生错误。JSON_ERROR_DEPTH:已超过最大堆栈深度。JSON_ERROR_STATE_MISMATCH:无效或格式错误的 JSON。JSON_ERROR_CTRL_CHAR:控制字符错误,可能编码不正确。JSON_ERROR_SYNTAX:语法错误。JSON_ERROR_UTF8:格式错误的 UTF-8 字符,可能编码不正确(自 PHP 5.3.3 起)。有了这些信息,我们可以编写一个快速解析辅助方法,在发现错误时引发描述性异常。
<?php
class JsonHandler {
protected static $_messages = array(
JSON_ERROR_NONE => 'No error has occurred',
JSON_ERROR_DEPTH => 'The maximum stack depth has been exceeded',
JSON_ERROR_STATE_MISMATCH => 'Invalid or malformed JSON',
JSON_ERROR_CTRL_CHAR => 'Control character error, possibly incorrectly encoded',
JSON_ERROR_SYNTAX => 'Syntax error',
JSON_ERROR_UTF8 => 'Malformed UTF-8 characters, possibly incorrectly encoded'
);
public static function encode($value, $options = 0) {
$result = json_encode($value, $options);
if($result) {
return $result;
}
throw new RuntimeException(static::$_messages[json_last_error()]);
}
public static function decode($json, $assoc = false) {
$result = json_decode($json, $assoc);
if($result) {
return $result;
}
throw new RuntimeException(static::$_messages[json_last_error()]);
}
}
?>
我们现在可以使用上一篇关于异常处理的文章中的异常测试功能来测试我们的异常是否正常工作。
// Returns "Correctly thrown"
assertException("Syntax error", function() {
$string = '{"foo": {"bar": {"cool": NONUMBER}}}';
$result = JsonHandler::decode($string);
});
请注意,从 PHP 5.3.3 开始,当在字符串中发现无效的 UTF-8 字符时会返回 JSON_ERROR_UTF8 错误。这强烈表明使用了不同于 UTF-8 的字符集。如果传入的字符串不在您的控制之下,您可以使用 utf8_encode 函数将其转换为 utf8。
<?php echo utf8_encode(json_encode($payload)); ?>
我过去一直使用它来转换从不使用 UTF-8 的旧版 MSSQL 数据库加载的数据。
资源