PHPJSON教程展示了如何在PHP中使用JSON。
$ php -v
php -v
PHP 8.1.2 (cli) (built: Aug 8 2022 07:28:23) (NTS)
...
我们使用PHP版本8.1.2。
JSON
JSON(JavaScript对象表示法)是一种轻量级数据交换格式。它很容易被人类阅读和编写,并被机器解析和生成。application/json
是JSON的官方互联网媒体类型。JSON文件扩展名为.json
。
json_encode
函数返回给定值的JSON表示形式。json_decode
采用JSON编码的字符串并将其转换为PHP变量。
Symfony和Laravel等PHP框架具有使用JSON的内置方法。
PHPJSON编码
在下面的例子中,我们使用了json_encode
函数。
<?php
$data = ["falcon", "sky", "cloud", "orange", "wood", "forest"];
header('Content-type:application/json;charset=utf-8');
echo json_encode($data);
该示例将PHP数组转换为JSON字符串。
$ php -S localhost:8000 encode.php
我们启动服务器并定位到localhost:8000
。
现代网络浏览器在响应标头中收到适当的内容类型时,会显示JSON数据的JSON视图。
PHPJSON解码
在下面的例子中,我们使用了json_decode
函数。
<?php
$data = '{
"name": "John Doe",
"occupation": "gardener"
}';
$a = json_decode($data, true);
header('Content-type:text/html;charset=utf-8');
echo "{$a["name"]} is a {$a["occupation"]}";
该示例将JSON字符串转换为PHP变量。
$ php -S localhost:8000 decode.php
我们启动服务器。
$ curl localhost:8000
John Doe is a gardener
我们使用curl发送GET请求。
从文件中读取PHPJSON
在下面的示例中,我们从文件中读取JSON数据。
[
{"name": "John Doe", "occupation": "gardener", "country": "USA"},
{"name": "Richard Roe", "occupation": "driver", "country": "UK"},
{"name": "Sibel Schumacher", "occupation": "architect", "country": "Germany"},
{"name": "Manuella Navarro", "occupation": "teacher", "country": "Spain"},
{"name": "Thomas Dawn", "occupation": "teacher", "country": "New Zealand"},
{"name": "Morris Holmes", "occupation": "programmer", "country": "Ireland"}
]
这是JSON数据。
<?php
$filename = 'data.json';
$data = file_get_contents($filename);
$users = json_decode($data);
?>
<html>
<table>
<tbody>
<tr>
<th>Name</th>
<th>Occupation</th>
<th>Country</th>
</tr>
<?php foreach ($users as $user) { ?>
<tr>
<td> <?= $user->name; ?> </td>
<td> <?= $user->occupation; ?> </td>
<td> <?= $user->country; ?> </td>
</tr>
<?php } ?>
</tbody>
</table>
</html>
在代码示例中,我们使用file_get_contents
读取文件并使用json_decode
将其解码为PHP数组。稍后,我们使用PHPforeach循环将数据放入表中。
从数据库读取PHPJSON
在下面的示例中,我们从SQLite数据库中读取数据并以JSON格式返回。
BEGIN TRANSACTION;
DROP TABLE IF EXISTS cities;
CREATE TABLE cities(id INTEGER PRIMARY KEY, name TEXT, population INTEGER);
INSERT INTO cities(name, population) VALUES('Bratislava', 432000);
INSERT INTO cities(name, population) VALUES('Budapest', 1759000);
INSERT INTO cities(name, population) VALUES('Prague', 1280000);
INSERT INTO cities(name, population) VALUES('Warsaw', 1748000);
INSERT INTO cities(name, population) VALUES('Los Angeles', 3971000);
INSERT INTO cities(name, population) VALUES('New York', 8550000);
INSERT INTO cities(name, population) VALUES('Edinburgh', 464000);
INSERT INTO cities(name, population) VALUES('Berlin', 3671000);
COMMIT;
此SQL代码在SQLite中创建一个cities
表。
$ sqlite3 test.db
sqlite> .read cities.sql
sqlite> SELECT * FROM cities;
1|Bratislava|432000
2|Budapest|1759000
3|Prague|1280000
4|Warsaw|1748000
5|Los Angeles|3971000
6|New York|8550000
7|Edinburgh|464000
8|Berlin|3671000
使用sqlite3
命令行工具,我们生成一个SQLite数据库并创建cities
表。
<?php
$db = new SQLite3('test.db');
$res = $db->query('SELECT * FROM cities');
$cities = [];
while ($row = $res->fetchArray()) {
$cities[] = $row;
}
header('Content-type:application/json;charset=utf-8');
echo json_encode(['cities' => $cities]);
在示例中,我们从数据库中检索数据并将其作为JSON返回。
PHPJSON和JS获取API
在下面的示例中,我们使用JavaScriptfetchAPI从PHP脚本中获取JSON数据。
[
{"name": "John Doe", "occupation": "gardener", "country": "USA"},
{"name": "Richard Roe", "occupation": "driver", "country": "UK"},
{"name": "Sibel Schumacher", "occupation": "architect", "country": "Germany"},
{"name": "Manuella Navarro", "occupation": "teacher", "country": "Spain"},
{"name": "Thomas Dawn", "occupation": "teacher", "country": "New Zealand"},
{"name": "Morris Holmes", "occupation": "programmer", "country": "Ireland"}
]
JSON数据存储在一个文件中。
<?php
$filename = 'data.json';
$data = file_get_contents($filename);
header('Content-type:application/json;charset=utf-8');
echo $data;
我们读取数据并将其返回给客户端。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Home page</title>
<style>
th,
td {
font: 15px 'Segoe UI';
}
table,
th,
td {
border: solid 1px #ddd;
border-collapse: collapse;
padding: 2px 3px;
text-align: center;
}
tr:nth-child(odd) {background: #efefef}
th {
font-weight: bold;
}
</style>
</head>
<body>
<button id="getData">Get data</button>
<br>
<br>
<div id="output"></div>
<script>
const getBtn = document.getElementById('getData');
const output = document.getElementById('output');
const table = document.getElementById('table');
getBtn.addEventListener('click', () => {
fetch('/data.php')
.then((res) => {
return res.json();
})
.then((data) => {
output.innerHTML = '';
let table = createTableAndHeader();
output.appendChild(table);
appendRows(table, data);
})
.catch((err) => {
console.log("error fetching data");
console.log(err);
})
});
function createTableAndHeader() {
let table = document.createElement("table");
let tr = table.insertRow(-1);
let headers = ["Name", "Occupation", "Country"];
for (let i = 0; i < 3; i++) {
let th = document.createElement("th");
th.innerHTML = headers[i];
tr.appendChild(th);
}
return table;
}
function appendRows(table, data) {
for (let i = 0; i < data.length; i++) {
let tr = table.insertRow(-1);
for (const [_, value] of Object.entries(data[i])) {
let cell = tr.insertCell(-1);
cell.innerHTML = value;
}
}
}
</script>
</body>
</html>
我们在文档中有一个按钮。当我们点击按钮时,fetch
函数从data.php
脚本中检索JSON数据。动态构建HTML表格并填充数据。