解析JSON使用可更改的键
问题描述:
我尝试使用php代码解析json变量。问题是一些数组键包含每次迭代可更改的值。顺便说一下,这不是一个重复的问题,没有什么比使用可变变量解析json。这里是我的JSON例子和PHP代码,也输出;解析JSON使用可更改的键
{
"link":"",
"host":"stream",
"filename":"Rock Ballads The Best Of 70-90's",
"icon":"https:\/\/i.ytimg.com\/vi\/JN80ayCfmW0\/hqdefault.jpg",
"streaming":{
"audio track in mp3 (54.54MB)":"http:\/\/server.example.parsing.com\/str\/wlqcjv8246\/Rock+Ballads+The+Best+Of+70-90%26%23039%3Bs%28p%29.mp3",
"360p video in mp4 (80.04MB)":"http:\/\/server.example.parsing.com\/str\/wlqcjyfc33\/Rock+Ballads+The+Best+Of+70-90%26%23039%3Bs%28480p%29.mp4",
"240p video in mp4 (76.55MB)":"http:\/\/server.example.parsing.com\/str\/wlqck18b72\/Rock+Ballads+The+Best+Of+70-90%26%23039%3Bs%28240p%29.mp4",
"144p video in mp4 (71.09MB)":"http:\/\/server.example.parsing.com\/str\/wlqck4e410\/Rock+Ballads+The+Best+Of+70-90%26%23039%3Bs%28144p%29.mp4"
},
"nb":0,
"error":"",
"paws":false
}
这是我使用的php代码;
if($host=="www.youtube.com"){
$decodeProcess = json_decode($output,true);
echo ($decodeProcess['filename']);
echo ($decodeProcess['icon']);
echo ($decodeProcess['streaming']['audio track in mp3 (54.54MB)']);
}
在这种情况下,文件名和图标效果很好,但“在MP3(54.54MB)音轨”或“MP4(71.09MB)144P的视频”是问题,我解析因为每次文件大小更改。我能做什么?
答
你有没有考虑过在数据结构上运行一个简单的映射操作,使它变成一个更可行的形式(基本上是从键中删除文件大小信息)?
这可能是这样的:
if($host=="www.youtube.com"){
$decodeProcess = json_decode($output,true);
// array of prefix matches that will be used as as substitution keys
$key_replacements = [
'audio' => 'audio',
'360p video' => 'video_360p',
'240p video' => 'video_240p',
'144p video' => 'video_144p'
];
foreach($decodeProcess['streaming'] as $key => $value) {
foreach ($key_replacements as $prefix => $replacement) {
if (strpos($key, $prefix) === 0) {
$decodeProcess['streaming'][$replacement] = $value;
break;
}
}
unset($decodeProces['streaming'][$key]);
}
echo ($decodeProcess['filename']);
echo ($decodeProcess['icon']);
echo ($decodeProcess['streaming']['audio']);
echo ($decodeProcess['streaming']['video_360p']);
}
您可能希望再封装整体的JSON反序列化和关键映射功能到它自己的函数或类方法当然。
+0
@AlperenÖzdemir对不起。在'$ key + replacements'数组定义中省略了逗号:P。固定。 –
只是为了澄清,你的变量'$ host'是从json键'“host”'? – Kai
你从哪里得到这个JSON?一种解决方案可能是循环遍历$ decodeProcess ['streaming']'并查看该密钥是否包含mp3中的音频轨道或其他内容。 –
如果是这样的话,那么你想解析json并将'$ host'分配给'someJson-> host'的内容 – Kai