介绍
首先,你有一个字符串。JSON 不是数组、对象或数据结构。JSON是一种基于文本的序列化格式 - 所以是一个花哨的字符串,但仍然只是一个字符串。使用json_decode()
在 PHP 中对其进行解码。
$data = json_decode($json);
在其中,您可能会发现:
这些是可以用JSON编码的东西。或者更准确地说,这些是PHP的版本,可以用JSON编码。
他们没有什么特别之处。它们不是“JSON对象”或“JSON数组”。您已经解码了 JSON - 您现在拥有了基本的日常 PHP 类型。
对象将是stdClass的实例,stdClass是一个内置类,它只是一个通用的东西,在这里并不重要。
访问对象属性
您可以访问其中一个对象的属性,就像访问任何其他对象的公共非静态属性一样,例如.$object->property
$json = '
{
"type": "donut",
"name": "Cake"
}';
$yummy = json_decode($json);
echo $yummy->type; //donut
访问数组元素
您可以像访问任何其他数组一样访问其中一个数组的元素,例如$array[0]
。
$json = '
[
"Glazed",
"Chocolate with Sprinkles",
"Maple"
]';
$toppings = json_decode($json);
echo $toppings[1]; //Chocolate with Sprinkles
用 foreach
迭代它。
foreach ($toppings as $topping) {
echo $topping, "\n";
}
釉面
巧克力与洒
枫木
或者搞砸任何一个 bazillion 内置数组函数。
访问嵌套项目
对象的属性和数组的元素可能是更多的对象和/或数组 - 您可以像往常一样继续访问它们的属性和成员,例如.$object->array[0]->etc
$json = '
{
"type": "donut",
"name": "Cake",
"toppings": [
{ "id": "5002", "type": "Glazed" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5004", "type": "Maple" }
]
}';
$yummy = json_decode($json);
echo $yummy->toppings[2]->id; //5004
当你这样做时,你会得到的不是对象,而是关联数组 - 带有键字符串的数组。同样,您可以像往常一样访问其元素,例如.$array['key']
$json = '
{
"type": "donut",
"name": "Cake",
"toppings": [
{ "id": "5002", "type": "Glazed" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5004", "type": "Maple" }
]
}';
$yummy = json_decode($json, true);
echo $yummy['toppings'][2]['type']; //Maple
访问关联数组项
将JSON对象解码为关联PHP数组时,您可以使用foreach(array_expression为$key = > $value)
语法迭代键和值,例如
$json = '
{
"foo": "foo value",
"bar": "bar value",
"baz": "baz value"
}';
$assoc = json_decode($json, true);
foreach ($assoc as $key => $value) {
echo "The value of key '$key' is '$value'", PHP_EOL;
}
指纹
键'foo'的值是'foo值'
键'bar'的值是'bar值'
键'baz'的值是'baz值'
不知道数据是如何构建的
阅读文档,了解从中获取 JSON 的任何内容。
查看 JSON - 其中,你看到大括号需要一个对象,你看到方括号需要一个数组。{}
[]
使用print_r()命中
解码后的数据:
$json = '
{
"type": "donut",
"name": "Cake",
"toppings": [
{ "id": "5002", "type": "Glazed" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5004", "type": "Maple" }
]
}';
$yummy = json_decode($json);
print_r($yummy);
并检查输出:
stdClass Object
(
[type] => donut
[name] => Cake
[toppings] => Array
(
[0] => stdClass Object
(
[id] => 5002
[type] => Glazed
)
[1] => stdClass Object
(
[id] => 5006
[type] => Chocolate with Sprinkles
)
[2] => stdClass Object
(
[id] => 5004
[type] => Maple
)
)
)
它会告诉您哪里有对象,哪里有数组,以及它们成员的名称和值。
如果你只能在迷路之前走得这么远 - 走那么远,用:print_r()
print_r($yummy->toppings[0]);
stdClass Object
(
[id] => 5002
[type] => Glazed
)
在这个方便的交互式 JSON 资源管理器中查看它。
将问题分解成更容易绕开头脑的碎片。
json_decode()
返回空值
发生这种情况是因为:
- JSON 完全由 .
null
- JSON是无效的 - 检查
json_last_error_msg
的结果或将其放入JSONLint之类的东西。
- 它包含嵌套深度超过 512 级的元素。可以通过将整数作为第三个参数传递给
json_decode()
来覆盖此默认最大深度。
如果您需要更改最大深度,则可能解决了错误的问题。找出为什么你会得到如此深度嵌套的数据(例如,你正在查询的生成JSON的服务有一个错误),并让它不发生。
对象属性名称包含特殊字符
有时,您的对象属性名称包含连字符或 at 符号之类的内容,这些内容不能在文本标识符中使用。相反,您可以使用大括号内的字符串文本来寻址它。-
@
$json = '{"@attributes":{"answer":42}}';
$thing = json_decode($json);
echo $thing->{'@attributes'}->answer; //42
如果将整数作为属性,请参阅:如何访问名称类似于整数的对象属性?作为参考。
有人在你的JSON中放了JSON
这很荒谬,但它发生了 - JSON中有JSON编码为字符串。解码,像往常一样访问字符串,解码它,并最终获得您需要的内容。
$json = '
{
"type": "donut",
"name": "Cake",
"toppings": "[{ \"type\": \"Glazed\" }, { \"type\": \"Maple\" }]"
}';
$yummy = json_decode($json);
$toppings = json_decode($yummy->toppings);
echo $toppings[0]->type; //Glazed
数据不适合内存
如果您的JSON太大而无法立即处理,事情开始变得棘手。看:json_decode()
如何排序
请参见:参考:在 PHP 中对数组和数据进行排序的所有基本方法。