декодирование вывода JSON из API-интерфейса переводчика Microsoft с помощью PHP

эта проблема кажется специфичной для microsofttranslator.com, поэтому, пожалуйста … любые ответы, если вы можете протестировать ее …

Используя следующий URL для перевода: http://api.microsofttranslator.com/V2/Ajax.svc/TranslateArray .. Я отправляю через cURL некоторые фантастические аргументы и возвращаю следующий результат:

[ { "From":"en", "OriginalTextSentenceLengths":[13], "TranslatedText":"我是最好的", "TranslatedTextSentenceLengths":[5] }, { "From":"en", "OriginalTextSentenceLengths":[16], "TranslatedText":"你是最好的", "TranslatedTextSentenceLengths":[5] } ] 

Когда я использую json_decode($output, true); на выходе из cURL, json_decode дает ошибку в отношении того, что синтаксис не подходит для возвращаемого JSON :

  json_last_error() == JSON_ERROR_SYNTAX 

Заголовки возвращаются с JSON:

Заголовки ответов

      Cache-Control:no-cache Content-Length:244 Content-Type:application/x-javascript; charset=utf-8 Date:Sat, 06 Aug 2011 13:35:08 GMT Expires:-1 Pragma:no-cache X-MS-Trans-Info:s=63644 

    Сырое содержимое:

      [{"From":"en","OriginalTextSentenceLengths":[13],"TranslatedText":"我是最好的","TranslatedTextSentenceLengths":[5]},{"From":"en","OriginalTextSentenceLengths":[16],"TranslatedText":"你是最好的","TranslatedTextSentenceLengths":[5]}] 

    Код cURL:

      $texts = array("i am the best" => 0, "you are the best" => 0); $ch = curl_init(); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $data = array( 'appId' => $bing_appId, 'from' => 'en', 'to' => 'zh-CHS', 'texts' => json_encode(array_keys($texts)) ); curl_setopt($ch, CURLOPT_URL, $bingArrayUrl . '?' . http_build_query($data)); $output = curl_exec($ch); 

    Related of "декодирование вывода JSON из API-интерфейса переводчика Microsoft с помощью PHP"

    API возвращает неправильный знак порядка байтов (BOM).
    Строковые данные сами по себе являются UTF-8, но добавляются с U+FEFF который представляет собой спецификацию UTF-16. Просто json_decode первые два байта и json_decode .

     ... $output = curl_exec($ch); // Insert some sanity checks here... then, $output = substr($output, 3); ... $decoded = json_decode($output, true); 

    Вот весь мой тестовый код.

     $texts = array("i am the best" => 0, "you are the best" => 0); $ch = curl_init(); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $data = array( 'appId' => $bing_appId, 'from' => 'en', 'to' => 'zh-CHS', 'texts' => json_encode(array_keys($texts)) ); curl_setopt($ch, CURLOPT_URL, $bingArrayUrl . '?' . http_build_query($data)); $output = curl_exec($ch); $output = substr($output, 3); print_r(json_decode($output, true)); 

    Что дает мне

     Array ( [0] => Array ( [From] => en [OriginalTextSentenceLengths] => Array ( [0] => 13 ) [TranslatedText] => 我是最好的[TranslatedTextSentenceLengths] => Array ( [0] => 5 ) ) [1] => Array ( [From] => en [OriginalTextSentenceLengths] => Array ( [0] => 16 ) [TranslatedText] => 你是最好的[TranslatedTextSentenceLengths] => Array ( [0] => 5 ) ) ) 

    Запись в Википедии по спецификации

    В вашей строке JSON нет ничего синтаксически неправильного. Возможно, что json возвращается с символами вне диапазона байтов UTF-8, но это приведет к тому, что json_decode () будет генерировать исключение, указывающее на это.

    Тестовый код:

     ini_set("track_errors", 1); $json = ' [ { "From":"en", "OriginalTextSentenceLengths":[13], "TranslatedText":"我是最好的", "TranslatedTextSentenceLengths":[5] }, { "From":"en", "OriginalTextSentenceLengths":[16], "TranslatedText":"你是最好的", "TranslatedTextSentenceLengths":[5] } ] '; $out = @json_decode($json, TRUE); if(!$out) { throw new Exception("$php_errormsg\n"); } else { print_r($out); } ?> 

    Вывод:

     $ php -f jsontest.php Array ( [0] => Array ( [From] => en [OriginalTextSentenceLengths] => Array ( [0] => 13 ) [TranslatedText] => 我是最好的[TranslatedTextSentenceLengths] => Array ( [0] => 5 ) ) [1] => Array ( [From] => en [OriginalTextSentenceLengths] => Array ( [0] => 16 ) [TranslatedText] => 你是最好的[TranslatedTextSentenceLengths] => Array ( [0] => 5 ) ) )