2016-11-07 4 views
0

Мне нужно получить содержимое JSON с внешнего сайта, но по какой-то странной причине я не могу сделать его массивом или объектом, а вместо json_decode возвращает его как строку. Если я копирую одно и то же исходное содержимое в полную длину в переменную и использую это вместо этого, он работает правильно: json_decode превращает его в объект/массив.json_decode возвращает строку вместо массива/объекта, если исходное содержимое принадлежит внешнему серверу

function isJson($string) { 
    json_decode($string); 
    return (json_last_error() == JSON_ERROR_NONE); 
} 

$url = "http://www.igetthestufffromhere.com"; 

$response = trim(strip_tags(file_get_contents($url))); 

Я попытался без отделки и strip_tags, а также попытался с CURL и результат тот же.

//$response ="[{\"SaleDate\":\"2015-10-22T14:09:00\",\"End\":\"2015-11-22T00:00:00\",...SHORTENED A LOT..\"ChildList\":null}],\"ExName\":\"SELVÄ\",\"SomeName\":\"\"}]"; 

echo "ENCODING:".mb_detect_encoding($response); returns: utf-8 every time 

if(isJson($response)){ 
    echo "Yes it is JSON"; // This is TRUE in both cases (local variable and fetched). 
} 

$json = json_decode($response, true); 

var_dump($json); 

var_dump возвращается: строка (302087) «» [{\ «SaleDate \» ....] «», когда я получаю ответ от этого другого домена, но когда я использую локальную переменную с точно таким же (139) {["SaleDate ...

Редактировать: Я не понимаю, почему я только что получил нисходящее зрение, я попробовал Чтобы решить это в течение примерно 5 часов, я вставил весь код, необходимый для ответа, и здесь есть настоящая проблема .. так что с моим вопросом !? У меня не должно быть этой проблемы? Мой первый вопрос на этом сайте тоже .

+1

Похоже, что '$ response' - это строка с двойным кодированием JSON. Если вы действительно имеете обратную косую черту в своем JSON, это плохой знак. – deceze

+0

Хорошо, спасибо, что поделились своим, хотя. Итак, почему он дважды закодирован в файле file_get_contents-version, а не в вставленном экземпляре и как это исправить? Я не могу изменить исходный текст. –

+0

Если вы вставляете строку '' [{\ "SaleDate \" ...}] "в PHP как' $ json = "[{\" SaleDate \ "...}]", значение изменяется, потому что это интерпретируется как литерал строки PHP. Чтобы точно сохранить значение, оно должно быть '$ json = '" [{\\ "SaleDate \\" ...}] "''. Вы приняли это во внимание ...? – deceze

ответ

1

Хорошо, проблема была nswered by @deceze

Это было потому, что JSON был декодирован в два раза. Поэтому его нужно было закодировать дважды. Вот рабочий код:

function isJson($string) { 
    json_decode($string); 
    return (json_last_error() == JSON_ERROR_NONE); 
} 

$url = "http://www.igetthestufffromhere.com"; 

$response = trim(strip_tags(file_get_contents($url))); 
$i=0; 
while (is_string($response)){ //if is still string 
    $response = json_decode($response); // decode to object 
    if($i>3){ // stop if still not working 
     break 1; 
    } 
    $i++; 
} 

var_dump($json); // is always JSON object