41、PHP 原生魅力 - 字符串 - 解码 JSON 字符串

作者: 温新

图书: 【原生 PHP 魅力】

阅读: 131

时间: 2024-09-08 00:03:40

从 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"]);
请登录后再评论