来自php数组的意外的json输出结构

时间:2018-03-13 05:03:43

标签: php json multidimensional-array arguments

我正在尝试转换动态数据。如何从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
    }
}

1 个答案:

答案 0 :(得分:2)

首先,用一些代码来演示需要调整的内容。

  1. item键向上移动一级(从最低的子阵列开始)
  2. 引用 - 包装您的$form_item值以使其成为字符串。
  3. 代码:(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