Строка кажется действительной JSON, но `json_decode ()` возвращает NULL

Я думаю, что нашел, где ошибка:

$convertJSON = file_get_contents("http://www.google.com/ig/calculator?hl=en&q=" . $currencyValue . $currencySelectValue . "%3D%3FUSD", true); var_dump($convertJSON); $convertArr = json_decode($convertJSON, true); var_dump($convertArr); 

Я делаю это для отладки, и получаю этот результат (я ввел 555 и евро):

 string(68) "{lhs: "555 Euros",rhs: "796.64700 US dollars",error: "",icc: true}" NULL 

Таким образом, кажется, что функция PHP для декодирования объекта JSON что-то делает что-то неправильно. Любая помощь?

Ответ Google дает вам недействительный JSON, потому что метки не цитируются. Вам придется самому разобрать.

 $response = '{lhs: "555 Euros",rhs: "796.64700 US dollars",error: "",icc: true'; preg_match('/rhs:\s*"([^"]+)"/', $response, $m); echo $m[1]; 

Вывод:

 796.64700 US dollars 

Не прямой ответ на этот вопрос, но проблема, которую я потратил несколько часов, пытаясь решить.

Если вы пытаетесь декодировать JSON, который поступает из удаленного файла через CURL, и если этот файл находится в формате UTF-8 , начало файла может иметь следующие символы (который разбивает json_decode ():

  

Которое вы не увидите невооруженным глазом, только через htmlentities(); Я понятия не имею, почему они там, я проследил это до curl_exec() , думая, что, возможно, они добавляются туда. В любом случае эти маленькие ублюдки добавлялись только тогда, когда файл находится в формате UTF-8.

Итак, если вы не контролируете кодировку исходного файла, вы можете сделать что-то вроде этого, прежде чем передать строку в json_decode ():

 $encoding = mb_detect_encoding($json); if($encoding == 'UTF-8') { $json = preg_replace('/[^(\x20-\x7F)]*/','', $json); } print_r(json_decode($json)); 

Надеюсь, я кое-что сэкономил, мне потребовалось несколько часов, чтобы выяснить, что происходит.

разделите его на все, кроме десятичных точек, запятых и чисел, и дайте мне результат.

На самом деле вы делаете то же самое с вашим регулярным выражением. Добавьте a после [ : [^ чтобы отменить это

 $currencyValue = preg_replace('/([^0-9\.,]+)/', '', $currencyValue); 

чтобы сделать json_encode работоспособным, вам нужно добавить двойную кавычку к строке результата, чтобы сделать ее в формате JSON.

Я пробую простой код ниже, и он отлично работает:

 $data = '{lhs: "1 US dollar",rhs: "7.80177256 Hong Kong dollars",error: "",icc: true}'; $data = str_replace('lhs','"lhs"',$data); $data = str_replace('rhs','"rhs"',$data); $data = str_replace('error','"error"',$data); $data = str_replace('icc','"icc"',$data); print_r(json_decode($data)); 

Результат:

 stdClass Object ( [lhs] => 1 US dollar [rhs] => 7.80177256 Hong Kong dollars [error] => [icc] => 1 ) 

Теперь он находится в объекте json_decode!

Расширение на Матфея отвечает:

Если по какой-то причине вы хотите получить все данные; (возможно, не на всякий случай?)

 $c='{lhs: "1 British pound",rhs: "1.5358 US dollars",error: "",icc: true}'; $j=json_decode(preg_replace('/({|,)([az]+): /','$1"$2": ',$c)); var_dump($j->{'rhs'}); 

Я наткнулся на эту страницу, прежде чем я ее обработал, поэтому, возможно, другие тоже будут 🙂