【问题标题】:Unexpected json output structure from php array来自php数组的意外json输出结构
【发布时间】:2018-08-21 06:20:31
【问题描述】:

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

【问题讨论】:

  • 您的代码运行良好。它给出了你想要的准确输出。
  • 我认为您将 json lint 数据与普通数据混淆了。
  • @DavidAddoteye 更新$form_item的值
  • $form_item 中有什么?
  • @Thamaraiselvam 谢谢。你说的对。那就是问题来的地方。它现在正在工作。再次感谢。

标签: php json multidimensional-array arguments


【解决方案1】:

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

  1. item 键上移一层(从最低的子数组中移出)
  2. 引用包装您的 $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)

【讨论】:

  • @David 我撤回了我的题外话:错字关闭投票。您正在使用我以前没有遇到过的语法。我真的很高兴你这样做了,因为它让我有理由研究 json 使用的 options 常量。
猜你喜欢
  • 2016-08-31
  • 1970-01-01
  • 1970-01-01
  • 2021-01-12
  • 1970-01-01
  • 2021-07-26
  • 2017-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多