Я пытаюсь получить конкретное значение (первое значение 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.
Вывод для: die($result);
Я пробовал это: before: $format = 'xml'; .......... if ($format == 'json') {$response = json_encode($result);} elseif ($format == 'xml') {$response = new SimpleXMLElement($result);}, и это не сработало.
если вы уверены, что получили ответ json, вы должны использовать $ response-> EndDate
Если вы хотите получить доступ к нему как к массиву, вы должны установить флаг Assoc в TRUE. $response = json_decode($result, true);
@ubuntux Я пробовал оба: $response = json_decode($result, true); и $response = json_encode($result, true);. Я получил это: Уведомление (8): Попытка получить свойство не-объекта
@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 Я пробовал: $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, '<' not found - Warning (2): simplexml_load_string() [<a href='http://php.net/function.simplexml-load-string'>function.simplexml-load-string</a>]: {"AssetWarrantyResponse":[],"InvalidFormatAssets":{"BadAssets":["n/a 09"]},"Inva
@mbenjemaa, см. мой ответ





Как сказал @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, '<' not found - Warning (2): simplexml_load_string() [<a href='http://php.net/function.simplexml-load-string'>function.simplexml-load-string</a>]: {"AssetWarrantyResponse":[],"InvalidFormatAssets":{"BadAssets":["n/a 09"]},"Inva - в var_dump($response->AssetEntitlement[0]->EndDate);: Notice (8): Trying to get property of non-object
Я только что добавил в свой вопрос скриншот XML-файла.
не могли бы вы вставить вывод die($result);? похоже на плохую разметку данных ответа.
Ставлю скриншот для die ($ result) в свой вопрос.
Я пробовал XML вместо JSON. переменная $ xml правильно отображает содержимое. Но я все еще получаю сообщение об ошибке var_dump ((string) $ xml-> AssetEntitlement [0] -> EndDate); - Я получил: Примечание (8): Попытка получить свойство не-объекта - mbenjemaa 10 минут назад
Я попробовал var_dump($xml->AssetWarrantyResponse); и получил структурированный вывод, как показано на этом изображении: ссылка на сайт
получил: $ xml = simplexml_load_string ($ result); $ xml = Xml :: toArray ($ xml); $ end_date = $ xml ['AssetWarrantyDTO'] ['AssetWarrantyResponse'] ['AssetWarrant antyResponse'] ['Asse tEntitlementData'] [' AssetEntitlement'] [0] ['EndDate']; отладка ('EndDate:'. $ end_date);
ответ от службы не json, он отформатирован xml, и вы не можете использовать функцию json_decode