我正在尝试转换动态数据。如何从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
}
}
答案 0 :(得分:2)
首先,用一些代码来演示需要调整的内容。
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
你知道,这些数字不是任意分配的;每个进步数字故意是前一个数字的两倍。为什么?因为如果您敢于列出多个options
,您可以编写一个代表任意两个或更多常量之和的数字,并且您永远不会意外地成为值碰撞的牺牲品。
这是什么意思?以下所有表达式都会产生相同的输出:
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)