为啥我的 JSON 数组会变成一个对象?

Posted

技术标签:

【中文标题】为啥我的 JSON 数组会变成一个对象?【英文标题】:Why does my JSON array turn into an object?为什么我的 JSON 数组会变成一个对象? 【发布时间】:2017-05-13 06:51:53 【问题描述】:

我正在尝试从 test_bots.json 中取消设置一个值并将其保存回来,但不知何故,数据格式在此过程中被更改。

test_bots.json 包含这个 JSON 数组:

["John","Vladimir","Toni","Joshua","Jessica"]

我的代码如下所示:

$good = 'Toni';
$good_arr = file_get_contents('test_bots.json');
$good_arr = json_decode($good_arr);

if(in_array($good, $good_arr))
        $key = array_search($good, $good_arr);
         unset($good_arr[$key]);

        $good_arr2 = json_encode($good_arr);
        file_put_contents('test_bots.json',$good_arr2); 
    

保存的输出是:

"0":"John","1":"Vladimir","3":"Joshua","4":"Jessica"

但我希望输出看起来像:

["John","Vladimir","Joshua","Jessica"]

我尝试在保存数组之前对其进行反序列化,但它不起作用。

为什么会这样?

【问题讨论】:

$good_arr 中的file_put_contents 更改为$good_arr2 看起来只是一个错字。正如@jardis 指出的那样,您没有将刚刚使用json_encode 创建的变量保存到文件中,而是保存了未编码的数组。 抱歉打错了。我编辑了我的问题。 @不要惊慌 这里的罪魁祸首是array_search() 【参考方案1】:

为了让json_encode 将带有数字键的 php 数组转换为 JSON 数组而不是 JSON 对象,键必须是连续的。 (参见the PHP manual for json_encode. 中的示例#4)

您可以在代码中使用array_values 完成此操作,这将在您删除其中一项后重新索引数组。

$good_arr2 = json_encode(array_values($good_arr));

【讨论】:

以上是关于为啥我的 JSON 数组会变成一个对象?的主要内容,如果未能解决你的问题,请参考以下文章

我的 PHP 引用数组“神奇地”变成了一个值数组……为啥?

为啥js二维数组传给后台接收到的数据变成了字符串

为啥我不能用我的 api 响应更新我的状态?数据是一个对象数组

Json字符串数组到Vuex中的对象

前端向后端传一个json数组对象

为啥我的数组未显示为已过滤?