在PHP中解析JSON元素


Parsing JSON elements in PHP

我有这一点php检索JSON字符串:

$login = "http://$server/auth/login/$username/$password";
$json = file_get_contents($login);

收到的JSON是:

{
   "Return":{
      "Type":"auth.login",
      "ResponseSummary":{
         "StatusCode":0,
         "ErrorMessage":""
      },
      "Results":{
         "SessionID":"fejqciel23dcjqvsumjdplq6s6",
         "User":{
            "Id":"*****",
            "AccountId":"*****",
            "FirstName":"*****",
            "LastName":"******",
            "Email":"*****@*****.***",
            "UserName":"*****@*****.***",
            "Group":"3",
            "Language":"English",
            "Measurement":"Imperial",
            "Timezone":"Etc'/GMT+8",
            "MsgFlag":"0",
            "Pincode":"",
            "Phone":"",
            "TerminationDate":null,
            "DaylightSavings":"0",
            "AcceptedWebsiteHardwareTc":"0",
            "APIContractAccepted":null,
            "DisplayNotice":"1",
            "NoticeInterval":"1 day",
            "TemporaryPassword":false,
            "Roles":[3, 11],
            "UserCode":******,
            "AccountName":"*****@*****.***",
            "CustomAttributes":[]
         },
         "AccountLastChangeDate":"2015-05-27 06:13:28"
      }
   }
}

我试图解析出SessionID。这是我唯一需要的东西。我已经阅读了其他几篇关于SO的文章,但要么一无所获,要么出现错误。

我试过的几件事:

$jsondata = json_decode($json, true);
echo $jsondata['Return'][0]['Results'][0]['User'][0]['SessionID'];

$jsondata = json_decode($json);
echo $jsondata->Return[0]->Results[0]->User[0]->SessionID;

和它们的许多变体。我要么什么也得不到,要么就是各种各样的错误。

提取SessionID的正确方法是什么?

我已经黑了它的工作使用一对字符串。但是我更喜欢正确地使用它。

谢谢!

在这种情况下,使用php --interactive可以帮助您查看正在处理的变量:

php > $jsonArr = json_decode($json, true);
php > var_dump($jsonArr);
array(1) {
  ["Return"]=>
  array(3) {
    ["Type"]=>
    string(10) "auth.login"
    ["ResponseSummary"]=>
    array(2) {
      ["StatusCode"]=>
      int(0)
      ["ErrorMessage"]=>
      string(0) ""
    }
    ["Results"]=>
    array(3) {
      ["SessionID"]=>
      string(26) "fejqciel23dcjqvsumjdplq6s6"
      ["User"]=>
      array(24) {
        ["Id"]=>
        string(5) "*****"
        ["AccountId"]=>
        string(5) "*****"
        ["FirstName"]=>
        string(5) "*****"
        ["LastName"]=>
        string(6) "******"
        ["Email"]=>
        string(15) "*****@*****.***"
        ["UserName"]=>
        string(15) "*****@*****.***"
        ["Group"]=>
        string(1) "3"
        ["Language"]=>
        string(7) "English"
        ["Measurement"]=>
        string(8) "Imperial"
        ["Timezone"]=>
        string(9) "Etc/GMT+8"
        ["MsgFlag"]=>
        string(1) "0"
        ["Pincode"]=>
        string(0) ""
        ["Phone"]=>
        string(0) ""
        ["TerminationDate"]=>
        NULL
        ["DaylightSavings"]=>
        string(1) "0"
        ["AcceptedWebsiteHardwareTc"]=>
        string(1) "0"
        ["APIContractAccepted"]=>
        NULL
        ["DisplayNotice"]=>
        string(1) "1"
        ["NoticeInterval"]=>
        string(5) "1 day"
        ["TemporaryPassword"]=>
        bool(false)
        ["Roles"]=>
        array(2) {
          [0]=>
          int(3)
          [1]=>
          int(11)
        }
        ["UserCode"]=>
        string(9) "something"
        ["AccountName"]=>
        string(4) "else"
        ["CustomAttributes"]=>
        array(0) {
        }
      }
      ["AccountLastChangeDate"]=>
      string(19) "2015-05-27 06:13:28"
    }
  }
}

如你所见,$jsonArr['Return']['Results']['SessionID']将得到你所需要的。您错误地认为JSON数组的元素索引为0。

decode as stdObject

$jsondata = json_decode($json, false);
echo $jsondata->Return->Results->SessionID;