41、PHP 原生魅力 - 字符串 - 解码 JSON 字符串
从 JSON 字符串到 PHP 对象:json_decode()
如果你有一个 JSON 格式的字符串(从文件加载,或通过 API 调用获取),你可以解析该字符串并将其转换为关联数组或对象。
JavaScript 对象表示法(JSON)是一种基于 JavaScript 对象语法的用于表示结构化数据的标准文本格式。它常用于 Web 应用程序中传输数据(例如,从服务器向客户端发送某些数据,以便在网页上显示,反之亦然)。
json_decode() 函数有一个必填参数,即 JSON 字符串,并默认返回对象(通过调整另外两个可选参数,你可以获得关联数组)。如果你有一个表示带有 name 和 age 属性的对象的 JSON 字符串:
$string = '{"name":"My Name","age":25}';
如果你想得到一个对象:
<?php
$string = '{"name":"My Name","age":25}';
$obj = json_decode($string);
print_r($obj);
输出如下:
$ php 1-json-decode.php
stdClass Object
(
[name] => My Name
[age] => 25
)
如果要获得关联数组:
<?php
$string = '{"name":"My Name","age":25}';
$arr = json_decode($string, true);
print_r($arr);
输出如下:
$ php 41-json-decode.php
Array
(
[name] => My Name
[age] => 25
)
使用第二个参数,你可以管理输出的类型,如果你想要一个对象,使用 false,如果你想要一个关联数组,使用 true。
转换标记
你有第三个参数标志。使用 Flags 参数,您可以控制解析过程的某些行为。允许的标志为:
常量 | 含义 |
---|---|
JSON_BIGINT_AS_STRING | 它将大整数解码为它们的原始字符串值,而不是浮点数 |
JSON_OBJECT_AS_ARRAY | 它将 JSON 对象解码为 PHP 数组 |
JSON_INVALID_UTF8_IGNORE | 它忽略无效的 UTF-8 字符 |
JSON_INVALID_UTF8_SUBSTITUTE | 它将无效的 UTF-8 字符转换为 Unicode 字符“替换字符 ”\uFFFD |
JSON_THROW_ON_ERROR | 如果发生错误,它会抛出 JsonException |
捕获解析中的错误
我的建议是在 try catch
块中使用 JSON_THROW_ON_ERROR:
<?php
$string = '{"name:"My Name","age":25}';
try {
$obj = json_decode($string, flags: JSON_THROW_ON_ERROR);
print_r($obj);
} catch (Exception $e) {
echo "Error parsing Json:" . PHP_EOL;
echo "ERROR CODE: " . $e->getCode() . PHP_EOL;
echo "ERROR MSG : " . $e->getMessage() . PHP_EOL;
}
输出如下:
$ php 1-json-decode.php
Error parsing Json:
ERROR CODE: 4
ERROR MSG : Syntax error
大整数
如果你有很大的整数,你想把它们转换成字符串格式,而不是默认的格式(浮点数):
<?php
$string = '{"name":"My Name","age":251234567890251234567890}';
$obj = json_decode($string, flags: JSON_BIGINT_AS_STRING);
var_dump($obj);
输出如下:
$ php 41-json-decode.php
object(stdClass)#1 (2) {
["name"]=>
string(7) "My Name"
["age"]=>
string(24) "251234567890251234567890"
}
更多标记
如果需要指定多个标志,可以使用位掩码运算符 |
.
<?php
try {
$string = '{"name":"My Name","age":25}';
$arr = json_decode($string, flags: JSON_THROW_ON_ERROR |
JSON_BIGINT_AS_STRING | JSON_OBJECT_AS_ARRAY | JSON_INVALID_UTF8_IGNORE);
} catch (JsonException $e) {
var_dump($e);
}
echo sprintf("Name: %s , age %d" . PHP_EOL, $arr["name"], $arr["age"]);
请登录后再评论