Failed to json_decode string from file_get_contents

后端 未结 2 1733
一整个雨季
一整个雨季 2020-12-11 11:43

I recently wanted to fetch and decode API response from a web service. I thought that just just file_get_contents and then json_decode the resultin

相关标签:
2条回答
  • 2020-12-11 12:26

    Recently I wanted to fetch and decode API response from a web service, then found out that it was a lot more than just file_get_contents and json_decode the string. I have to deal with gzipped response and malformed JSON to finally decode the string.

    After hours of searching, both functions below had just saved my day.

    // http://stackoverflow.com/questions/8895852/uncompress-gzip-compressed-http-response
    if ( ! function_exists('gzdecode')) {
    /**
     * Decode gz coded data
     * 
     * http://php.net/manual/en/function.gzdecode.php
     * 
     * Alternative: http://digitalpbk.com/php/file_get_contents-garbled-gzip-encoding-website-scraping
     * 
     * @param string $data gzencoded data
     * @return string inflated data
     */
    function gzdecode($data)     {
        // strip header and footer and inflate
    
        return gzinflate(substr($data, 10, -8));
    }
    }
    
    
    /**
     * Fetch the requested URL and return it as decoded json object
     * 
     * @author string  Murdani Eko
     * @param  string  $url
     */
    function get_json_decode( $url ) {
    
      $response = file_get_contents( $url );
      $response = trim( $response );
    
      // is it a valid json string?
      $jsondecoded = json_decode( $response );
      if( json_last_error() == JSON_ERROR_NONE ) {
        return $jsondecoded;
      }
    
      // yay..! it's a gzencoded string
      if( json_last_error() == JSON_ERROR_UTF8 ) {
        $response = gzdecode($response);
    
        /* After gzdecoded, there is a chance that the response 
         * will have extra character after the curly brackets e.g. }}gi or }} ee
         * This will cause malformed JSON, and later failed json decoding
         */
    
        // we search-reverse the closing curly bracket position
        $last_curly_pos = strrpos($response, '}');
        $last_curly_pos++; 
    
        // extract the correct json format using the last curly bracket position
        $good_response = substr($response, 0, $last_curly_pos);
    
        return json_decode( $good_response );
      }
    }
    
    0 讨论(0)
  • 2020-12-11 12:28

    you can use curl instead of file_get_contents and get page content without any encoding

       function get_url($link){
    
          $ch = curl_init();
          curl_setopt($ch, CURLOPT_HEADER, 0);
          curl_setopt($ch, CURLOPT_VERBOSE, 0);
          curl_setopt($ch,CURLOPT_ENCODING, '');
          curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
          curl_setopt($ch, CURLOPT_URL, ($link));
          $response = curl_exec($ch);
          curl_close($ch);
          return ($response); 
    
    
        }
    
    0 讨论(0)
提交回复
热议问题