【问题标题】:Return json enconde associative array only one item返回json编码关联数组只有一项
【发布时间】:2018-04-30 01:34:26
【问题描述】:

我有一个$variable = array(...);

我需要像这样打印一个 JSON 响应

{
  info: {
    "foo": true,
    "bar": "lion"
  },
  data: [
    {"id": 123,
     "name": "foo",
     "baz": {  "some":1,
               "data":true
             }
    },
    {"id": 321,
     "name": "bar",
     "baz": {}
    }
  ]
}

所以,问题出在response["data"][1]["baz"]

有时,这个变量可以是一个空数组{},但是当我使用json_encode 时,将它返回为无关联数组[]

我需要这个变量作为关联数组

但是如果在 PHP 中我们放

echo json_encode($variable,JSON_FORCE_OBJECT);

返回这个

{
  info: {
    "foo": true,
    "bar": "lion"
  },
  data: {
    0: {"id": 123,
        "name": "foo",
        "baz": {  "some":1,
                  "data":true
                }
    },
    1: {"id": 321,
        "name": "bar",
        "baz": {}
       }
  ]
}

response["data"] 必须是一个无关联数组

因此,

  • 以关联数组{} 的形式返回baz(即使为空,这也是问题所在)。
  • 返回 data 始终为无关联数组 []

response["data"] 必须是一个列表,因为它被 javascript 中的外部库读取

【问题讨论】:

    标签: php arrays json associative-array


    【解决方案1】:

    如果您将相关属性设为ArrayObject 而不是内置数组,则无论它是否为空,它都会被序列化为对象。

    # Converting the existing array, which may be empty, to an ArrayObject
    $baz = new ArrayObject($baz);
    
    # Or create a new ArrayObject
    $baz = new ArrayObject();
    $baz['a'] = 'b';
    

    在数组为空的情况下,您也可以使用stdClass 类。这将被序列化为一个空对象 ({})。

    if (empty($baz)) {
        $baz = new stdClass();
    }
    

    【讨论】:

    • 不行,我试试new ArrayObject()new stdClass()
    • 使用这些,您可以删除 JSON_FORCE_OBJECT。
    • 我尝试不使用JSON_FORCE_OBJECTbaz 仍然是[]
    • 我的错,没关系,谢谢,$row_['d'] = $row_['d'] === null ? new ArrayObject() : $row_['d'];,完美运行
    猜你喜欢
    • 1970-01-01
    • 2015-10-27
    • 2013-03-08
    • 2015-03-27
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多