我正在尝试转换动态数据。如何从 PHP 获取此 JSON:
/*JSON*/
{
"122240cb-253c-4046-adcd-ae81266709a6": {
"item": {
"0": "3"
}
}
}
这就是我所做的,但它不起作用:
/*PHP*/
$json = array("122240cb-253c-4046-adcd-ae81266709a6"=> array(
"item" => array($form_item)
));
echo json_encode($json, JSON_FORCE_OBJECT + JSON_PRETTY_PRINT);
这是我得到的结果,而不是上面的结果。
{
"122240cb-253c-4046-adcd-ae81266709a6": {
"0": {
"item": 3
}
}
最佳答案
首先,用一些代码来演示需要调整的内容。
- 将
item
键向上移动一级(从最低子数组中移出) - 用引号包裹您的
$form_item
值,使其成为一个字符串。
代码:(Demo)
$form_item = 3;
$original_json = array("122240cb-253c-4046-adcd-ae81266709a6"=> array(
array("item" => $form_item)
));
echo json_encode($original_json, JSON_FORCE_OBJECT + JSON_PRETTY_PRINT);
echo "\n---\n";
$form_item = "3";
$desired_json = array("122240cb-253c-4046-adcd-ae81266709a6"=> array(
"item" => array($form_item)
));
echo json_encode($desired_json, JSON_FORCE_OBJECT + JSON_PRETTY_PRINT);
输出:
{
"122240cb-253c-4046-adcd-ae81266709a6": {
"0": {
"item": 3
}
}
}
---
{
"122240cb-253c-4046-adcd-ae81266709a6": {
"item": {
"0": "3"
}
}
}
现在进入更有趣的部分,乍一看让我感到困惑......
您正在使用我以前从未见过且未在 json_encode() documentation page 中提及的选项参数语法.您列出了多个 json constants并用 +
而不是手册中演示的管道 (|
) 将它们分开。
为了解释为什么这是有效的语法,我必须表达“幕后”发生的事情。
常量实际上是“位掩码”。每个常量都分配了一个数字。
JSON_HEX_TAG => 1
JSON_HEX_AMP => 2
JSON_HEX_APOS => 4
JSON_HEX_QUOT => 8
JSON_FORCE_OBJECT => 16
JSON_NUMERIC_CHECK => 32
JSON_UNESCAPED_SLASHES => 64
JSON_PRETTY_PRINT => 128
JSON_UNESCAPED_UNICODE => 256
JSON_PARTIAL_OUTPUT_ON_ERROR => 512
JSON_PRESERVE_ZERO_FRACTION => 1024
你看,这些数字不是随意分配的;每个累进数字都是前一个数字的两倍。为什么?因为如果你敢于列出多个选项
,你可以写一个数字来表示任何两个或更多常量的总和,你永远不会意外地成为值(value)冲突的牺牲品。
这是什么意思?以下所有表达式都产生相同的输出:
echo json_encode($json, JSON_FORCE_OBJECT | JSON_PRETTY_PRINT);
echo json_encode($json, JSON_FORCE_OBJECT + JSON_PRETTY_PRINT);
echo json_encode($json, 16 + 128);
echo json_encode($json, 144);
要证据吗? ( Demo )
关于php - 来自 php 数组的意外 json 输出结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49248632/