【问题标题】:What happens when you pass a non-associative array to json_encode()?将非关联数组传递给 json_encode() 时会发生什么?
【发布时间】:2016-12-23 17:01:15
【问题描述】:

我的代码是:

<?php 
    $arr = array();
    array_push($arr,"One","Two","Three");
    print_r($arr);
    echo '<br>';
    echo json_encode($arr);
?>

如您所见,我将一个非关联数组传递给json_encode()。我得到的输出是

数组([0] => 一 [1] => 二 [2] => 三)
["一","二","三"]

输出的第二行到底是什么?如果我们将关联数组传递给json_encode(),则返回的是一个JSON 对象,但返回的这个数组绝对不像JSON 对象。那是什么?

另外,有没有办法使用json_encode() 将非关联数组转换为 JSON 对象?

【问题讨论】:

  • 这是一个简单的数字索引数组。
  • 这有时会导致某些 JSON 解析器出现问题,但它是一个 JSON 对象。它是数组表示,但一些解析器希望根节点是 {} 类型的对象。

标签: php arrays json


【解决方案1】:

如果你想用正确的对象表示法来获取它,试试这个:

echo json_encode($arr,JSON_FORCE_OBJECT);

输出:

{"0":"One", "1":"Two", "2":"Three"}

参考json_encode() options

【讨论】:

    【解决方案2】:

    嗨,你也可以试试这个

    echo json_encode((object)$arr);
    

    输出

    {"0":"One","1":"Two","2":"Three"}
    

    【讨论】:

      【解决方案3】:

      我让自己成为一个有用的函数,每当我通过 JavaScript 的 Fetch API 调用 API 时,我都会在 PHP 中调用它。

      /**
       * Ends script with a clean JSON HTTP reponse
       * @param array $data 
       * @param int $responseCode Default is 200
       * @return never 
       */
      function json_response(array $data = [], int $responseCode = 200)
      {
          ob_clean();
      
          header_remove();
      
          header("Content-type: application/json; charset=utf-8");
      
          http_response_code($responseCode);
      
          die(json_encode($data, JSON_FORCE_OBJECT));
      }
      

      它首先清理输出缓冲区,这样您就不会从以前的输出中得到错误,为 JSON 设置内容类型,并且您可以选择使用响应代码 500 进行响应。它还存在脚本执行,避免输出任何其他内容的风险。

      它也适用于你的情况。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-21
        • 1970-01-01
        • 1970-01-01
        • 2017-04-19
        • 1970-01-01
        • 2012-01-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多