json_encode PHP 数组作为 JSON 数组而不是 JSON 对象

Posted

技术标签:

【中文标题】json_encode PHP 数组作为 JSON 数组而不是 JSON 对象【英文标题】:json_encode PHP array as JSON array not JSON object 【发布时间】:2012-06-27 02:00:37 【问题描述】:

我在 php 中有以下数组:

Array
(
    [0] => Array
        (
            [id] => 0
            [name] => name1
            [short_name] => n1
        )

    [2] => Array
        (
            [id] => 2
            [name] => name2
            [short_name] => n2
        )
)

我想将其 JSON 编码为 JSON 数组,生成如下字符串:

[  
      
        "id":0,
        "name":"name1",
        "short_name":"n1"
    ,
      
        "id":2,
        "name":"name2",
        "short_name":"n2"
    
]

但是当我在这个数组上调用json_encode 时,我得到以下信息:

  
    "0":  
        "id":0,
        "name":"name1",
        "short_name":"n1"
    ,
    "2":  
        "id":2,
        "name":"name2",
        "short_name":"n2"
    

这是一个对象而不是一个数组。

我怎样才能让json_encode 将我的数组编码为数组呢?

【问题讨论】:

【参考方案1】:

参见 RFC 8259 中的 ArraysJavaScript 对象表示法 (JSON) 数据交换格式

数组结构表示为围绕零的方括号 或更多值(或元素)。元素用逗号分隔。

array = begin-array [ value *( value-separator value ) ] end-array

您正在观察这种行为,因为您的数组不是连续的 - 它有键 02,但没有 1 作为键。

只有数字索引是不够的。 json_encode 只会将您的 PHP 数组编码为 JSON 数组,前提是您的 PHP 数组是连续的 - 也就是说,如果它的键是 0、1、2、3,...

您可以使用array_values 函数按顺序重新索引您的数组以获得您想要的行为。例如,以下代码在您的用例中成功运行:

echo json_encode(array_values($input)).

【讨论】:

但是如果键 0,2 很重要呢?我处于无法重新索引数组的情况。 JSON 不支持关联数组。参考:tools.ietf.org/html/rfc7159#section-5【参考方案2】:

json_decode($jsondata, true);

true 将所有属性转换为数组(顺序或非顺序)

【讨论】:

与 OP 提出的问题无关。 OP专门询问使用json_encode遇到的编码问题 这怎么不相关?这显示了使用 json_encode 的示例,因此它将数据转换为可读数组。 OP 的问题是“我怎样才能让 json_encode 将我的数组编码为数组”我的代码就是这样做的。我猜是“编码”这个词让你感到沮丧?通过“编码”,他的意思是“变成”。这不是投反对票的理由。 哦,我现在明白你的意思了,你会推荐这样的东西 $serialized = json_encode($nonContiguousArray); $unserialize = json_decode($serialized, true); 最后 finallySerializedInArrayFormat = json_encode($unserialize); 如果这是你想要的,你是对的,但似乎有点啰嗦的解决方案.【参考方案3】:

试试这个,

<?php
$arr1=array('result1'=>'abcd','result2'=>'efg'); 
$arr2=array('result1'=>'hijk','result2'=>'lmn'); 
$arr3=array($arr1,$arr2); 
print (json_encode($arr3)); 
?>

【讨论】:

这并不能解决 OP 试图提出的问题。【参考方案4】:

JSON 中的Array 是索引数组,因此您尝试获取的结构不是有效的 Json/javascript

PHP Associatives 数组是 JSON 中的对象,因此除非不需要索引,否则无法进行此类转换。

如果你想得到这样的结构,你可以这样做:

$indexedOnly = array();

foreach ($associative as $row) 
    $indexedOnly[] = array_values($row);


json_encode($indexedOnly);

将返回类似:

[
     [0, "name1", "n1"],
     [1, "name2", "n2"],
]

【讨论】:

感谢您给我索引数组的线索 :) 问题是我索引它的方式是 id 也是数组的 id 而不是顺序 id 并且 json_encode 没有选择它作为一个数组但作为对象而不是因为该数组不是顺序的,现在它已修复,感谢您的所有帮助:) 不正确。一些库确实将关联数组编码为具有索引作为元素属性之一的数组。 我不明白你的意思 - Martin 的答案中的数组是非索引的,这是有效的 JSON。 @AndFinally,Martin 的答案 is 中的数组实际上是隐式索引的。省略索引会导致索引数组从零开始。 这个答案并没有完全提供 OP 在他们发布问题时想要的东西(毫不奇怪,因为 OP 想要的东西是不可能的),从那时起他们对它的编辑似乎留下了这个答案鉴于问题的当前状态,这是完全错误的。您无法删除此答案,因为它已被接受,但可能会标记版主为您删除它?由于它有超过 5 个赞成票,因此您将保留您的代表。

以上是关于json_encode PHP 数组作为 JSON 数组而不是 JSON 对象的主要内容,如果未能解决你的问题,请参考以下文章

PHP json_encode将行作为对象而不是数组返回[重复]

php json_encode后的json里面的int类型变成string类型

PHP数组到JSON数组使用json_encode();

PHP json_encode 变量如何转换成数组?

php使用json_encode把二维数组变为json格式,Javascrpt如何变回数组

PHP json_encode转换空数组为对象