首页 > 解决方案 > CakePHP:从远程 JSON 文件中获取值

问题描述

我正在尝试从远程 JSON 文件中获取特定值(“EndDate”的第一个值)。

我的 JSON 看起来像这样:

<AssetEntitlementData>
<AssetEntitlement>
    <EndDate>2016-03-18T23:59:59</EndDate>
    <EntitlementType>EXTENDED</EntitlementType>
    <ItemNumber>995-1933</ItemNumber>
    <ServiceLevelCode>ND</ServiceLevelCode>
</AssetEntitlement>
<AssetEntitlement>
    <EndDate>2016-03-18T23:59:59</EndDate>
    <EntitlementType>EXTENDED</EntitlementType>
    <ItemNumber>995-2093</ItemNumber>
</AssetEntitlement>
<AssetEntitlement>
    <EndDate>2014-03-18T23:59:59</EndDate>
    <EntitlementType>INITIAL</EntitlementType>
    <ItemNumber>995-0923</ItemNumber>
    <ServiceLevelCode>ND</ServiceLevelCode>
</AssetEntitlement>
<AssetEntitlement>
    <EndDate>2014-03-18T23:59:59</EndDate>
    <EntitlementType>INITIAL</EntitlementType>
    <ItemNumber>995-1553</ItemNumber>
    <ServiceLevelCode>TS</ServiceLevelCode>
</AssetEntitlement>
</AssetEntitlementData>
</AssetEntitlementData>

这是我的代码:

<?php 
     $tag = '11111111';
     $apikey='XXXXXXXXXXXXX';
     $url= 'https://example.com';
     $data = array('ID'=> $tag);
     $format = 'json';
     $options = array(
          'http' => array(
          'header'  => "Content-type: application/x-www-form-urlencoded\r\n"
               ."apikey : 5c1e4f40-8094-4719-9995-7475572d2efa\r\n"
               . "Accept : application/$format",
               'method'  => 'POST',
               'content' => http_build_query($data),
               )
          );
          $context  = stream_context_create($options);
          $result = file_get_contents($url1, false, $context);
          if ($result === FALSE) { /* Handle error */ 
                    }

          var_dump($result);
          if($format == 'json')
          {
              $response = json_decode($result);
          }

          var_dump($result->EndDate);
         echo "END";
?>

试:

var_dump($response->EndDate);

我得到:注意(8):未定义的属性:stdClass::$EndDate

试:

var_dump($response['EndDate']);

我收到一个错误:

不能将 stdClass 类型的对象用作数组。

在此处输入图像描述

输出:die($result);

在此处输入图像描述

标签: cakephpcakephp-3.x

解决方案


正如@Metalik 所说,您的响应数据不是 JSON,而是 XML。如果您想以 XML 对象的形式访问您的数据,请使用simplexml_load_string()

$xml = simplexml_load_string($result);

并获得 的第一个值EndDate

var_dump((string)$xml->AssetEntitlement[0]->EndDate);

要将您的数据作为 JSON 对象访问,请将其转换$xml为 JSON 字符串,然后再转换为 JSON 对象:

$json = json_encode($xml); // To JSON string
$response = json_decode($json); // To JSON object

EndDate...从 JSON 对象中获取第一个值:

var_dump($response->AssetEntitlement[0]->EndDate);

要将您的数据作为关联数组访问,请将其转换$xml为 JSON 字符串,然后再转换为关联数组:

$json = json_encode($xml); // To JSON string
$response = json_decode($json, true); // To associative array

EndDate...从数组中获取第一个值:

var_dump($response['AssetEntitlement'][0]['EndDate']);

最后,您的响应数据似乎缺少AssetEntitlementData. 它应该是:

<AssetEntitlementData>
    <AssetEntitlement>
        <EndDate>2016-03-18T23:59:59</EndDate>
        <EntitlementType>EXTENDED</EntitlementType>
        <ItemNumber>995-1933</ItemNumber>
        <ServiceLevelCode>ND</ServiceLevelCode>
    </AssetEntitlement>
    <AssetEntitlement>
        <EndDate>2016-03-18T23:59:59</EndDate>
        <EntitlementType>EXTENDED</EntitlementType>
        <ItemNumber>995-2093</ItemNumber>
    </AssetEntitlement>
    <AssetEntitlement>
        <EndDate>2014-03-18T23:59:59</EndDate>
        <EntitlementType>INITIAL</EntitlementType>
        <ItemNumber>995-0923</ItemNumber>
        <ServiceLevelCode>ND</ServiceLevelCode>
    </AssetEntitlement>
    <AssetEntitlement>
        <EndDate>2014-03-18T23:59:59</EndDate>
        <EntitlementType>INITIAL</EntitlementType>
        <ItemNumber>995-1553</ItemNumber>
        <ServiceLevelCode>TS</ServiceLevelCode>
    </AssetEntitlement>
</AssetEntitlementData>

推荐阅读