json_encode(); function in php

时间:2015-09-30 23:16:22

标签: php json

I am trying to get expected json format after using json_encode($loc); in PHP.

$loc['location1'] =  Array(

                       "city"    =>"test",                  
                       "addr" => Array 
                                    (
                                        "addr1"=> "test",
                                        "addr2"=> "test"

                                    ),
                     );

expected json:

"location1": {
                "city": "test",
                "addr": {
                    "addr1": "test",
                    "addr2": "test"
                }
            }

instead of:

"0": {
            "location1": {
                "city": "test",
                "addr": {
                    "addr1": "test",
                    "addr2": "test"
                }
            }
        },

Please advise, thank you.

2 个答案:

答案 0 :(得分:0)

首先,正如Leggendario所说,您的预期代码无效json。 要获得有效的json,它必须是一个值(如果它不是数字,则引用),对象或数组。

其次,根据您的代码得到与您的期望类似的内容,您可以这样做:

$loc = array(
    "location1" => array(
        "city" => "test",                  
        "addr" => array(
            "addr1"=> "test",
            "addr2"=> "test"
        ),
    )
);

然后致电:

json_encode($loc);

将输出:

{
    "location1": {
        "city": "test",
        "addr": {
            "addr1": "test",
            "addr2": "test"
        }
    }
}

您可以在http://jsonlint.com/

中查看您的json输出

所以基本上差异在于你作为参数传递给json_encode()

答案 1 :(得分:0)

stdClass和数组之间存在差异。 PHP中的stdClass是一个通用的空类。 在javascript中,这被定义为......

var obj = {};

数组是以数字索引0开头的值的索引。在javascript中,这定义为...

var array = [];

在javascript中,您不能以精确的方式拥有关联数组,您可以在PHP中定义它们。因此,如果在PHP中使用关联数组并使用json编码,则关联键的索引将为0。

$loc['location1'] in PHP becomes  0:[{'location'} etc...

解决方案是将其移至stdClass。最简单的方法是用stdClass替换数组,并使用(object)将数组转换为对象。

<?php
$loc  = new stdClass;

$loc->location = (object) Array(
                   "city"    =>"test",                  
                   "addr" => (object) Array 
                                (
                                    "addr1"=> "test",
                                    "addr2"=> "test"
                                ),
                 );
?>

这应该可以解决问题。