CakePHP: получение значения из удаленного файла JSON

Я пытаюсь получить конкретное значение (первое значение EndDate) из удаленного файла JSON.

Мой 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']);

У меня ошибка:

Cannot use object of type stdClass as array.

CakePHP: получение значения из удаленного файла JSON

Вывод для: die($result);

CakePHP: получение значения из удаленного файла JSON

ответ от службы не json, он отформатирован xml, и вы не можете использовать функцию json_decode

Metalik 14.06.2018 17:47

Я пробовал это: before: $format = 'xml'; .......... if ($format == 'json') {$response = json_encode($result);} elseif ($format == 'xml') {$response = new SimpleXMLElement($result);}, и это не сработало.

mbenjemaa 14.06.2018 17:52

если вы уверены, что получили ответ json, вы должны использовать $ response-> EndDate

Metalik 14.06.2018 17:55

Если вы хотите получить доступ к нему как к массиву, вы должны установить флаг Assoc в TRUE. $response = json_decode($result, true);

ubuntux 14.06.2018 18:18

@ubuntux Я пробовал оба: $response = json_decode($result, true); и $response = json_encode($result, true);. Я получил это: Уведомление (8): Попытка получить свойство не-объекта

mbenjemaa 14.06.2018 18:24

@mbenjemaa, ваши данные ответа не в формате JSON, это XML, как то, что сказал @Metalik. Если вы хотите преобразовать его в JSON, вы должны сделать: $xml = simplexml_load_string($result);, затем преобразовать его в JSON: $json = json_encode($xml);, затем декодировать его для доступа как объект: $response = json_decode($json); или как ассоциативный массив: $response = json_decode($json, true);. попробуйте сбросить значение $response после json_decode() с флагом assoc и без него, чтобы увидеть разницу: var_dump($response);

ubuntux 14.06.2018 18:34

@ubuntux Я пробовал: $xml = simplexml_load_string($result); $json = json_encode($xml); $response = json_decode($json); var_dump($response); и получил 2 предупреждения: Warning (2): simplexml_load_string(): Entity: line 1: parser error : Start tag expected, '&lt;' not found - Warning (2): simplexml_load_string() [<a href='http://php.net/function.simplexml-load-string'>functio‌​n.simplexml-load-str‌​ing</a>]: {&quot;AssetWarrantyResponse&quot;:[],&quot;InvalidFormatAss‌​ets&quot;:{&quot;Bad‌​Assets&quot;:[&quot;‌​n/a 09&quot;]},&quot;Inva

mbenjemaa 14.06.2018 18:53

@mbenjemaa, см. мой ответ

ubuntux 14.06.2018 18:57
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
269
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как сказал @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>

Спасибо. У меня по-прежнему возникают ошибки: в $xml = simplexml_load_string($result);: Warning (2): simplexml_load_string(): Entity: line 1: parser error : Start tag expected, '&lt;' not found - Warning (2): simplexml_load_string() [<a href='http://php.net/function.simplexml-load-string'>functio‌​n.simplexml-load-str‌​ing</a>]: {&quot;AssetWarrantyResponse&quot;:[],&quot;InvalidFormatAss‌​ets&quot;:{&quot;Bad‌​Assets&quot;:[&quot;‌​n/a 09&quot;]},&quot;Inva - в var_dump($response->AssetEntitlement[0]->EndDate);: Notice (8): Trying to get property of non-object

mbenjemaa 14.06.2018 19:11

Я только что добавил в свой вопрос скриншот XML-файла.

mbenjemaa 14.06.2018 19:28

не могли бы вы вставить вывод die($result);? похоже на плохую разметку данных ответа.

ubuntux 14.06.2018 19:30

Ставлю скриншот для die ($ result) в свой вопрос.

mbenjemaa 14.06.2018 19:41

Я пробовал XML вместо JSON. переменная $ xml правильно отображает содержимое. Но я все еще получаю сообщение об ошибке var_dump ((string) $ xml-> AssetEntitlement [0] -> EndDate); - Я получил: Примечание (8): Попытка получить свойство не-объекта - mbenjemaa 10 минут назад

mbenjemaa 14.06.2018 20:27

Я попробовал var_dump($xml->AssetWarrantyResponse); и получил структурированный вывод, как показано на этом изображении: ссылка на сайт

mbenjemaa 14.06.2018 21:09

получил: $ xml = simplexml_load_string ($ result); $ xml = Xml :: toArray ($ xml); $ end_date = $ xml ['AssetWarrantyDTO'] ['AssetWarrantyResponse'] ['AssetWarrant antyResponse'] ['Asse‌ tEntitlementData'] ['‌ AssetEntitlement'] [0‌] ['EndDate']; отладка ('EndDate:'. $ end_date);

mbenjemaa 14.06.2018 21:40

Другие вопросы по теме