将 JSON 编码为对象,即使它具有零索引


Encoding JSON as an object, even when it has a zero-index

我有一个数组,可能看起来像这样:

array(
  1 => "foo",
  4 => "bar"
)

当我json_encode它时,结果是这样的:

{
  "1": "foo",
  "4": "bar"
}

这正是我需要的。

但是,数组可能如下所示:

array(
  0 => "baz"
)

在这种情况下,我希望 JSON 最终如下所示:

{
  "0": "baz"
}

但相反,它的结局是这样的:

[
  "baz"
]

有什么方法可以强制 JSON 编码器假设这是一个对象而不是数组?

编辑:抱歉,我在这篇文章中简化了它,但现在我意识到它非常重要:这个数组嵌套在另一个数组中,该数组必须是一个数组,而不是一个对象。

编辑2:示例:

array(
  0 => array(
    0: "baz"
  ),
  1 => array(
    4: "bar"
  )
)

需要成为:

[
  {
    0: "baz"
  },
  {
    4: "bar"
  }
]

尝试使用这个:

$test = array(
  0 => array(
    0=> "baz"
  ),
  1 => array(
    4=> "bar"
  )
);
$json = json_encode($test, JSON_FORCE_OBJECT);
var_dump($json);

从 PHP 5.3.0 开始可用。

首先将其

强制转换为对象:

<?php
$array = array(
  0 => "baz"
);
echo json_encode((object)$array);
?>

输出:

{"0":"baz"}

编辑:

<?php
$array = array(
  0 => array(
    0=> "baz"
  ),
  1 => array(
    4=> "bar"
  )
);
$array = castOnConsecutiveRecursive($array);
echo json_encode($array);
//json_encode acts as you want unless the array is consecutive from 0, so if that's the case then we have to cast it
function isConsecutive($array){
    $lastIndex = null;
    foreach($array as $key=>$value){
        if(is_null($lastIndex)){
            $lastIndex = $key;
            if($key !== 0)
                return false;
            continue;
        }
        if($lastIndex !== $key+1)
            return false;
    }
    return true;
}
function castOnConsecutiveRecursive($array){
    foreach($array as $key => $value){
        if(is_array($value)){
            $array[$key] = castOnConsecutiveRecursive($value);
            if(isConsecutive($value))
                $array[$key] = (object)$value;
        }
    }
    return $array;
}
?>

编辑2:Doh,在文档中没有看到该选项,如果您使用的是 PHP 5.3.0+,请使用 teo 的答案