PHP Manual
/
数据结构

PHP中的Json - 处理、生成和格式化

26. 11. 2019

Obsah článku

创建Json数据格式是为了方便在客户端和服务器之间传输结构化数据。

将一个数组或对象转换为json

为了将数组或对象转换为Json,在PHP中有一个函数json_encode

$user = [
'名称' => '扬',
'姓氏' => '巴拉塞克',
'作用' => [
'管理员',
'主持人',
],
];
echo json_encode($user);

它将产生。

{"name":"Jan","surname":"Barasek","role":["admin","moderator"]}

json_encode()函数也可以转换其他数据类型。例如,我们可以直接插入integer(整数),string(字符串),等等。

Json漂亮的打印 - 更好的人类可读性

在默认配置中,json被生成为一个长字符串。这是因为要尽可能少地占用空间的原因。

如果你需要更好的人类可读性,只需传递JSON_PRETTY_PRINT常量作为第二个参数。

echo json_encode($users, JSON_PRETTY_PRINT);

它将产生。

{
"名称": "扬",
"姓氏": "巴拉塞克",
"作用": [
"管理员",
"主持人"
]
}

格式化json - 自定义格式化规则

通过PHP对json的正常格式化,没有额外的设置,我们只能满足于这种输出。例如,如果我们想缩进制表符而不是空格(或以任何方式修改生成规则),我们必须自己编程。

这个函数已经可以做基本的格式化,我们只需要修改它。

function prettyJsonPrint(string $json): string
{
$result = '';
$level = 0;
$in_quotes = false;
$in_escape = false;
$ends_line_level = NULL;
$json_length = strlen($json);
for ($i = 0; $i < $json_length; $i++) {
$char = $json[$i];
$new_line_level = NULL;
$post = '';
if ($ends_line_level !== NULL) {
$new_line_level = $ends_line_level;
$ends_line_level = NULL;
}
if ($in_escape) {
$in_escape = false;
} else if ($char === '"') {
$in_quotes = !$in_quotes;
} else if (!$in_quotes) {
switch ($char) {
case '}':
case ']':
$level--;
$ends_line_level = NULL;
$new_line_level = $level;
break;
case '{':
case '[':
$level++;
case ',':
$ends_line_level = $level;
break;
case ':':
$post = '';
break;
case "":
case "\t":
case "\n":
case "\r":
$char = '';
$ends_line_level = $new_line_level;
$new_line_level = NULL;
break;
}
} else if ($char === '\\') {
$in_escape = true;
}
if ($new_line_level !== NULL) {
$result .= "\n" . str_repeat("\t", $new_line_level);
}
$result .= $char . $post;
}
return $result;
}

来源 : https://stackoverflow.com/questions/6054033/pretty…

例如,输入。

{"钥匙1":[1,2,3],"钥匙2":"价值"}

格式化为。

{
"钥匙1": [
1,
2,
3
],
"钥匙2": "价值"
}

这就更容易阅读了(因为每个元素的缩进一致)。

将json符号着色为HTML

有时,用颜色突出显示键、数据本身和个别格式化元素(特别是闭合括号)是很有用的。

例如,输入。

{"访问": {"象征性的": {"发布时间": "2008-08-16T14:10:31.309353", "过期": "2008-08-17T14:10:31Z", "身份证": "MIICQgYJKoZIhvcIegeyJpc3N1ZWRfYXQiOiAi"}, "服务目录": [], "用户": {"帐号": "ajay", "角色链接": [], "身份证": "16452ca89", "角色": [], "名称": "ajay"}}}

格式化为。

{<br   "访问": {
   "token": {
      "issued_at""2008-08-16T14:10:31.309353"
    "expires""2008-08-17T14:10:31Z"
    "id": "MIICQgYJKoZIhvcIegeyJpc3N1ZWRfYXQiOiAi"
    },
   "serviceCatalog": [br>    ], 
   "user": {
     "用户名": "ajay", 
    "role_links": [
)      ], 
"16452ca89"
    "角色": [br>      ], 
     "name": "ajay"
    }
。   }
}

这可以通过以下函数来实现。

function jsonColorFormater(string $json, string $indentation = "\t"): string
{
$crl = 0;
$ss = false;
$buffer = '';
for ($c = 0; $c < strlen($json); $c++) {
if ($json[$c] == '}' || $json[$c] == ']') {
$crl--;
$buffer .= "\n" . str_repeat($indentation, $crl);
}
if ($json[$c] == '"' && (@$json[$c - 1] == ',' || @$json[$c - 2] == ',')) {
$buffer .= "\n" . str_repeat($indentation, $crl);
}
if ($json[$c] == '"' && !$ss) {
$buffer .= '<span style="color:'.((@$json[$c - 1] == ':' || @$json[$c - 2] == ':') ? '#35D' : '#C22').';">';
}
$buffer .= $json[$c];
if ($json[$c] == '"' && $ss) $buffer .= '</SPAN>';
if ($json[$c] == '"') $ss = !$ss;
if ($json[$c] == '{' || $json[$c] == '[') {
$crl++;
$buffer .= "\n". str_repeat($indentation, $crl);
}
}
// 返回HTML源代码
return '<pre>' . $buffer . '</pre>';
}
//只需调用这个并返回格式化的输出
// echo jsonColorFormater($data, ' ');

特征取自并彻底改写自: https://stackoverflow.com/a/20953262/6777550

从JSON转换为PHP数组/对象

这可以用json_decode()函数来实现,它将Json做成一个数据结构,我们必须将其作为一个对象来处理。

$json = '{"名":"Jan", "姓":"Barasek", "角色":["管理员", "版主"]}。';
$decode = json_decode($json);
echo $decode->name; // 返回 "Jan"。
// echo $decode->role;
//
// 这是不可能的,因为属性角色
//包含一个数组,我们需要进行遍历。
echo '';
foreach ($decode->role as $role) {
echo '<li>' . $role . '</li>'; // 连续列出子弹背后的角色
}
echo '</ul>';

在javascript中处理

例如,在jQuery库中,一个json字符串可以非常容易地被解析成一个对象。

var json = '{"名":"Jan", "姓":"Barasek", "角色":["管理员", "版主"]}。';
var parser = $.parseJSON(json);
document.write('名字。' + parser.name);
console.log(parser); // 将整个对象打印到控制台以进行调试

在javascript中,一般来说,任何json都是一个有效的javascript对象,可以直接操作,也可以访问其属性。

Jan Barášek   Více o autorovi

Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.

Rád vám pomůžu:

Související články

1.
Status:
All systems normal.
2024