使用PHP访问第三级和第四级JSON数据
好极了! 我在php访问json数组中的第3级和第4级数据时遇到了一个小问题。根据下面的json数据,我有一个“servicelist”,从这个servicelist中我有一堆信息,比如服务器的IP地址和在它下面运行的进程 我的问题是如何使用php循环遍历这个ip地址及其下服务的值 json数据如下:使用PHP访问第三级和第四级JSON数据,php,arrays,json,Php,Arrays,Json,好极了! 我在php访问json数组中的第3级和第4级数据时遇到了一个小问题。根据下面的json数据,我有一个“servicelist”,从这个servicelist中我有一堆信息,比如服务器的IP地址和在它下面运行的进程 我的问题是如何使用php循环遍历这个ip地址及其下服务的值 json数据如下: { “格式\版本”:0, “结果”:{ “查询时间”:1480964905000, “cgi”:“statusjson.cgi”, “用户”:“nagiosadmin”, “查询”:“服务列表”,
{
“格式\版本”:0,
“结果”:{
“查询时间”:1480964905000,
“cgi”:“statusjson.cgi”,
“用户”:“nagiosadmin”,
“查询”:“服务列表”,
“查询状态”:“已发布”,
“程序启动”:1480936959000,
“上次数据更新”:1480964898000,
“类型代码”:0,
“键入文本”:“成功”,
“消息”:”
},
“数据”:{
“选择器”:{
“主机组”:“高级”
},
“服务列表”:{
"104.11.2.25": {
“磁盘”:2,
“L2TP”:2,
“负载”:2,
“OPENVPN TCP”:2,
“OPENVPN UDP”:2,
"平":二,,
“PPTP”:2,
"过程":二,,
“用户”:2,
“XL2TPD”:2
},
"104.44.13.17": {
“磁盘”:2,
“L2TP”:2,
“负载”:2,
“OPENVPN TCP”:2,
“OPENVPN UDP”:2,
"平":四,,
“PPTP”:2,
"过程":二,,
“用户”:2,
“XL2TPD”:2
},
"14.244.15.16": {
“磁盘”:2,
“L2TP”:2,
“负载”:2,
“OPENVPN TCP”:2,
“OPENVPN UDP”:2,
"平":四,,
“PPTP”:2,
"过程":二,,
“用户”:2,
“XL2TPD”:2
}
}
}
}
您可以尝试以下代码:
<?php
$username = "thisuser";
$password = "this password";
$url = "http://nagios.services.com/nagios/cgi-bin/statusjson.cgi?query=servicelist&hostgroup=Servers&hoststatus=up+down+unreachable+pending&servicestatus=ok+warning+critical+unknown+pending";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$jsonData = json_decode(curl_exec($ch), true);
curl_close($ch);
foreach($jsonData['data']['servicelist'] as $ip => $service_list) {
echo "<p>IP Address: {$ip}, Load: {$service_list['LOAD']}</p>";
}
?>
下面是一个简单的示例,说明如何处理数据结构
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>
<body>
<?php
ini_set('display_errors', 1); ini_set('log_errors',1); error_reporting(E_ALL);
$s = '{
"format_version": 0,
"result": {
"query_time": 1480964905000,
"cgi": "statusjson.cgi",
"user": "nagiosadmin",
"query": "servicelist",
"query_status": "released",
"program_start": 1480936959000,
"last_data_update": 1480964898000,
"type_code": 0,
"type_text": "Success",
"message": ""
},
"data": {
"selectors": {
"hostgroup": "Premium"
},
"servicelist": {
"104.11.2.25": {
"DISK": 2,
"L2TP": 2,
"LOAD": 2,
"OPENVPN TCP": 2,
"OPENVPN UDP": 2,
"PING": 2,
"PPTP": 2,
"PROCESS": 2,
"USERS": 2,
"XL2TPD": 2
},
"104.44.13.17": {
"DISK": 2,
"L2TP": 2,
"LOAD": 2,
"OPENVPN TCP": 2,
"OPENVPN UDP": 2,
"PING": 4,
"PPTP": 2,
"PROCESS": 2,
"USERS": 2,
"XL2TPD": 2
},
"14.244.15.16": {
"DISK": 2,
"L2TP": 2,
"LOAD": 2,
"OPENVPN TCP": 2,
"OPENVPN UDP": 2,
"PING": 4,
"PPTP": 2,
"PROCESS": 2,
"USERS": 2,
"XL2TPD": 2
}
}
}
}';
$jsonData = json_decode($s);
echo '<table border=1>';
$titles = array_keys((array)current($jsonData->data->servicelist));
echo '<tr>';
echo '<td>IP Address</td>';
foreach($titles as $col){
echo '<td>' . $col . '</td>';
}
echo '<tr>';
foreach($jsonData->data->servicelist as $key => $data){
echo '<tr>';
echo "<td>$key</td>";
foreach ($data as $prop => $val){
echo "<td>$val</td>";
}
echo '</tr>';
}
echo '</table>';
?>
</body>
</html>
无标题文件
结果=
您的$jsonData
基本上是一个数组,因此可以访问。如果您至少发布一段有效的JSON$result->LOAD
,这是错误的$result
是一个整数,它没有任何属性(例如LOAD
)@RiggsFolly我更新了json使其有效。@Steve你能给我一个更准确的信息吗?不工作只是显示一个空白屏幕。无论如何,谢谢你的帮助。第二点注意:这是一个http错误500I实际上在我的代码中有一个名为$services\u list
的变量,这就是导致页面显示为空白的原因。现在,我将变量替换为$jsonData
。你现在可以查一下。它正在工作。。但我希望它是在一个表格上,根据这个表格,如何计算每列中的值OK
?'1'=>'待定','2'=>'确定','4'=>'警告','8'=>'未知','16'=>'关键'。这个答案有效,但不是问题的解决方案。无论如何,非常感谢你的帮助!
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>
<body>
<?php
ini_set('display_errors', 1); ini_set('log_errors',1); error_reporting(E_ALL);
$s = '{
"format_version": 0,
"result": {
"query_time": 1480964905000,
"cgi": "statusjson.cgi",
"user": "nagiosadmin",
"query": "servicelist",
"query_status": "released",
"program_start": 1480936959000,
"last_data_update": 1480964898000,
"type_code": 0,
"type_text": "Success",
"message": ""
},
"data": {
"selectors": {
"hostgroup": "Premium"
},
"servicelist": {
"104.11.2.25": {
"DISK": 2,
"L2TP": 2,
"LOAD": 2,
"OPENVPN TCP": 2,
"OPENVPN UDP": 2,
"PING": 2,
"PPTP": 2,
"PROCESS": 2,
"USERS": 2,
"XL2TPD": 2
},
"104.44.13.17": {
"DISK": 2,
"L2TP": 2,
"LOAD": 2,
"OPENVPN TCP": 2,
"OPENVPN UDP": 2,
"PING": 4,
"PPTP": 2,
"PROCESS": 2,
"USERS": 2,
"XL2TPD": 2
},
"14.244.15.16": {
"DISK": 2,
"L2TP": 2,
"LOAD": 2,
"OPENVPN TCP": 2,
"OPENVPN UDP": 2,
"PING": 4,
"PPTP": 2,
"PROCESS": 2,
"USERS": 2,
"XL2TPD": 2
}
}
}
}';
$jsonData = json_decode($s);
echo '<table border=1>';
$titles = array_keys((array)current($jsonData->data->servicelist));
echo '<tr>';
echo '<td>IP Address</td>';
foreach($titles as $col){
echo '<td>' . $col . '</td>';
}
echo '<tr>';
foreach($jsonData->data->servicelist as $key => $data){
echo '<tr>';
echo "<td>$key</td>";
foreach ($data as $prop => $val){
echo "<td>$val</td>";
}
echo '</tr>';
}
echo '</table>';
?>
</body>
</html>