首页 > 解决方案 > PHP/json_encode:处理具有数字属性的混合数组和对象

问题描述

我最近不得不解决遗留 PHP 应用程序中的一个错误。此应用程序接收来自另一个应用程序的请求,其 JSON 格式如下:

{
  "someList": [
    "item A",
    "item B"
  ],
  "ratings": {
    "0": 0.001234,
    "1": 0.0666,
    "2": 0.09876,
    "3": 0.777777
  }
}

当它被反序列化为原生 PHP“关联数组”时,列表和映射(带有键 0、1、2 和 3)看起来都像列表。没关系,我可以解决这个问题。但是,此应用程序会对此数据进行计算并添加更多内容,然后以大致相同的格式序列化回 JSON 并将其发送到另一个应用程序。这就是问题所在。开箱即用json_encode($data)的上述结果:

{
  "someList": [
    "item A",
    "item B"
  ],
  "ratings": [
    0.001234,
    0.0666,
    0.09876,
    0.777777
  ]
}

我的钥匙都不见了...

我看到我可以使用JSON_FORCE_OBJECTlaecho json_encode($data, JSON_FORCE_OBJECT)但后来我得到:

{
  "someList": {
    "0": "item A",
    "1": "item B"
  },
  "ratings": {
    "0": 0.001234,
    "1": 0.0666,
    "2": 0.09876,
    "3": 0.777777
  }
}

现在我在第一个列表中有键,这是我不想要的。有没有一种方法可以序列化这个 JSON,使其someList成为一个列表(无键)和ratings一个映射/对象(带有键 0、1、2 和 3)?

标签: phpjsonassociative-array

解决方案


当对数组列表调用 json_encode 时,数字一致索引从 0 开始,PHP 会将列表视为索引数组,而不是关联数组。要强制 php 将其视为关联数组,您可以在调用 json_encode 之前将数组强制转换为对象。

例子:

$somelist = ["item A", "item B"];
$ratings = [0.001234, 0.666, 0.09876, 0.777777];
$final = ['someList' => $somelist, 'ratings' => (object) $ratings];

echo json_encode($final);

输出:

{["item A","item B"],{"0":0.001234,"1":0.666,"2":0.09876,"3":0.777777}}

推荐阅读