多维数组上的 json_encode() - 带有字符串键

Posted

技术标签:

【中文标题】多维数组上的 json_encode() - 带有字符串键【英文标题】:json_encode() on a multidimensional array - with string keys 【发布时间】:2013-05-01 10:40:22 【问题描述】:

我正在使用 php 创建一个非常大的多维数组。每个对象都包含名称、ID、ParentID 和 Children。子项是具有相同格式的多个对象的数组。

命名每个对象的 ID 很重要——这有助于我将每个对象放在正确的父对象下。 (在下面的代码中,我使用 101、102 等)

但是,我遇到的问题是当我使用json_encode 以 JSON 格式返回数组时。每个 'Children' 数组都被打印为一个对象,而不是一个数组 - 如下面的 JSON 代码所示。

正如我在另一个 SO 线程 here 上所读到的,它们“由于包含字符串键而被制成对象”——尽管它们是数字,但它们仍然是字符串。


"101": 
    "ID": "101",
    "ParentID": "0",
    "Name": "Root One"
    "Children": 
        "102": 
            "ID": "102",
            "ParentID": "101",
            "Name": "Child One"
        ,
        "103": 
            "ID": "103",
            "ParentID": "101",
            "Name": "Child Two",
            "Children": 
                "104": 
                    "ID": "104",
                    "ParentID": "103",
                    "Name": "Child Child One"
                
            
        ,

有人知道如何解决这个问题吗?

编辑: JSON 应该如下所示(方括号很重要!):

[

    "ID": "101",
    "ParentID": "0",
    "Name": "Root One",
    "Children": [
        
            "ID": "102",
            "ParentID": "101",
            "Name": "Child One",
            "Children": [

【问题讨论】:

实际上是因为索引不连续,即有间隙。 另外,你的“孩子”是对象(从我的角度来看)而不是数组。高兴,让 OOP 在你的内心流动。 【参考方案1】:

JSON 数组没有明确的索引,它只是一个有序列表。唯一具有命名键的 JSON 数据结构是一个对象。文字应该很明显:

["foo", "bar", "baz"]

这个数组没有命名索引,也没有任何规定可以添加任何索引。

PHP 将列表和键值存储合并为一种array 数据类型。 JSON 没有。

【讨论】:

关联数组有命名键 @mohammad PHP 有“关联数组”,JSON 没有! JSON 的“关联数组”称为 objects 谢谢,我遇到的问题是 JSON 的结构(请参阅我上次的编辑)。问题是由于我的 PHP 关联数组中的命名键引起的。【参考方案2】:

这是你的对象:

$parent=new StdClass();
$parent->ID=101;
$parent->ParentID=0;
$parent->Name='Root One';

$child1=new StdClass();
$child1->ID=1011;
$child1->ParentID=$parent->ID;
$child1->Name='Child One';
$parent->Children[]=$child1;


$child1_1=new StdClass();
$child1_1->ID=10111;
$child1_1->ParentID=$child1->ID;
$child1_1->Name='Child One One';
$child1->Children[]=$child1_1;    

这是你的 JSON 转换函数:

echo json_encode($parent,JSON_PRETTY_PRINT);

这是您编码成 JSON 格式的对象:


    "ID": 101,
    "ParentID": 0,
    "Name": "Root One",
    "Children": [
        
            "ID": 1011,
            "ParentID": 101,
            "Name": "Child One",
            "Children": [
                
                    "ID": 10111,
                    "ParentID": 1011,
                    "Name": "Child One One"
                
            ]
        
    ]

答案是后来才出现的,因为我后来开始学习 PHP。不管怎样,总有一天,有人会发现它很有用。

【讨论】:

【参考方案3】:

我现在有了一个快速且运行良好的有效解决方案。

    首先,正如问题中的 SO 链接所写;

    在 JSON 中,数组只有数字键,而对象有字符串 特性。包含数组键会强制整个外部 结构必须是一个对象。

    在 JSON 中;花括号保存对象 (),方括号保存数组 ([])。

    因此,使用字符串作为键将导致 json_encode 函数返回对象,而重置键将确保它创建数组。

    因此,就在我返回 JSON 编码字符串之前,我运行了一个函数来重置所有数组键。我在这个 SO 线程 (Reset array keys in multidimensional array) 上找到的代码特别有用!

【讨论】:

【参考方案4】:

http://php.net/manual/en/function.json-decode.php

将 json_decode 的第二个参数设置为 true 以至少获取关联数组。

除此之外:javascript 无法处理非连续/非连续数组索引,因此一旦 id 不连续,json 就没有其他选择将其转换为“字符串”索引。

【讨论】:

感谢您的回答,以后肯定会有用,但是我在jQuery中使用的是返回的JSON! 这几乎不会改变 javascript 无法处理非顺序数组键的事实。因此 JSON 也不能。因此 jquery 也不能。 在这篇文章发布 1 年后没有评论的反对票......有人想知道为什么 o.O

以上是关于多维数组上的 json_encode() - 带有字符串键的主要内容,如果未能解决你的问题,请参考以下文章

多维数组json_encode之后产生对象而不是数组问题

多维数组json_encode之后产生对象而不是数组问题

在 PHP 7.0 中编码多维数组不起作用 (json_encode)

多维数组 PHP-JSON

php,json_encode,嵌套数组,带有一个“左连接”查询

json_encode() 转义 / 带有 \ [重复]