使用PHP访问第三级和第四级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”, “查询”:“服务列表”,

好极了! 我在php访问json数组中的第3级和第4级数据时遇到了一个小问题。根据下面的json数据,我有一个“servicelist”,从这个servicelist中我有一堆信息,比如服务器的IP地址和在它下面运行的进程

我的问题是如何使用php循环遍历这个ip地址及其下服务的值

json数据如下:
{
“格式\版本”: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>