我有许多JSON文件,并且当其中只有一个对象时,它们的数据类型不一致。我试图更改包含一项的文件,以使我引用的元素始终是数组。
这是一个“好的” JSON文件的示例:
{
"apiv2": {
"items": [{
"id": "00001",
"name": "ITEM 1"
}, {
"id": "00002",
"name": "ITEM 2"
}]
}
}
用PHP术语来说,$ json-> apiv2-> items始终是一个数组,可以对其应用相同的功能。
我经常有一个JSON文件,其中包含一项:
{
"apiv2": {
"items": {
"id": "00003",
"name": "ITEM 3"
}
}
}
当我尝试使用相同的函数遍历“项目”时,它们失败了,因为它现在是对象而不是数组。
我的目标是更改JSON数据并重写文件,以使单个项目文件与多个项目文件保持一致:
{
"apiv2": {
"items": [{
"id": "00003",
"name": "ITEM 3"
}]
}
}
也许是因为它是星期五下午,但是我似乎无法绕过这个。我以为会很简单:
$json->apiv2->items = (array) $json->apiv2->items;
但这只是将其转换为包含两个元素“ id”和“ name”的数组,而不是包含该对象的一个元素。
答案 0 :(得分:1)
正如我在评论中所说
这样做的时候
$json->apiv2->items = (array) $json->apiv2->items;
PHP将$items
转换为实际数组[ "id" => "00003", "name" => "ITEM 3"]
这将为您提供结果['items' => [ "id" => "00003", "name" => "ITEM 3"]]
您需要包装,而不是转换您的对象
$json->apiv2->items = [$json->apiv2->items];
更高级的:由于有时items
可以是数组,有时不能为数组,因此您可以制作一个other question来包装它们
function wrap($value)
{
if (is_null($value)) {
return [];
}
return is_array($value) ? $value : [$value];
}
$json->apiv2->items = wrap($json->apiv2->items);
POC:function [1]
[1]从Laravel帮助者中被盗
答案 1 :(得分:0)
使用json_decode()
并按以下方式进行访问:
$json = '{"apiv2":{"items": [{"id": "00001", "name": "ITEM 1" }, {"id": "00002", "name": "ITEM 2" }]}}';
print_r(json_decode($json, true)['apiv2']['items']);