php - 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_OBJECT
laecho 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)?
解决方案
当对数组列表调用 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}}
推荐阅读
- dax - DAX 期初余额按天计算在月份和年份上不正确
- ios - Xcode 11.6 (11E708) 中的 Interface Builder 以 XML 格式显示故事板
- java - ConsumerRecord在apache spring kafka中包含双引号“”xxxxxxxxxxxxxx“”内的键值
- javascript - 如何忽略谷歌浏览器中的这个错误?
- apache-spark - Spark 结构化流中的不同计数的聚合引发错误
- json - 如何在 postgresql 的 json 列中添加 varcahr 列
- html - 使用查询将 gist 中的 JSON 加载到表中
- c# - Visual Studio:无法加载 2 个版本的 Json.NET 并使用别名
- mitmproxy - 如何在启动期间向 mitmdump 提供证书密码
- angular - OccAdapters 和 Services 的使用区别是什么?