解码两个JSON源代码并使用PHP / HTML显示的问题

时间:2015-11-03 19:15:51

标签: php json

我使用两个JSON提要源和PHP来显示网站上代理的房地产属性幻灯片。代码在供稿提供商更改其存储属性和代理图像的位置之前工作。我已对图像进行了必要的调整,但Feed数据现在无法正常工作。我已经就这个问题联系了饲料供应商,但他们说问题就在我身边。除了图像URL之外没有任何更改,因此我不确定问题的位置。我是JSON的新手,所以我可能会遗漏一些东西。我已经在下面添加了完整的脚本。以下是两个JSON供稿网址:http://century21.ca/FeaturedDataHandler.c?DataType=4&EntityType=2&EntityID=2119http://century21.ca/FeaturedDataHandler.c?DataType=3&AgentID=27830&RotationType=1。第一个URL抓取所有代理,第二个URL抓取单个代理的属性。 AgentID值源自JSON提要URL。

class Core
{

    private $base_url;
    private $property_image_url;
    private $agent_id;

    private $request_agent_properties_url;
    private $request_all_agents_url;

    private function formatJSON($json)
    {
        $from = array('Props:', 'Success:', 'Address:', ',Price:', 'PicTicks:', ',Image:', 'Link:', 'MissingImage:', 'ShowingCount:', 'ShowcaseHD:', 'ListingStatusCode:', 'Bedrooms:', 'Bathrooms:', 'IsSold:', 'ShowSoldPrice:', 'SqFootage:', 'YearBuilt:', 'Style:', 'PriceTypeDesc:');
        $to = array('"Props":', '"Success":', '"Address":', ',"Price":', '"PicTicks":', ',"Image":', '"Link":', '"MissingImage":', '"ShowingCount":', '"ShowcaseHD":', '"ListingStatusCode":', '"Bedrooms":', '"Bathrooms":', '"IsSold":', '"ShowSoldPrice":', '"SqFootage":', '"YearBuilt":', '"Style":', '"PriceTypeDesc":' );
        return str_ireplace($from, $to, $json); //returns the clean JSON

    }

    function __construct($agent=false)
    {
        $this->base_url  = 'http://www.century21.ca';
        $this->property_image_url = 'http://images.century21.ca';

        $this->agent_id = ($agent ? $agent : false);

        $this->request_all_agents_url =
            $this->base_url.'/FeaturedDataHandler.c?DataType=4&EntityType=3&EntityID=3454';

        $this->request_agent_properties_url =
            $this->base_url.'/FeaturedDataHandler.c?DataType=3'.'&AgentID='.$this->agent_id.'&RotationType=1';
    }

    /**
     * getSlides()
     */
    function getSlides()
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $this->request_all_agents_url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        $response = curl_exec($ch);
        curl_close($ch);

        if (empty($response))
            return false;
        else
        $agents = $this->decode_json_string($response);

        // Loop Agents And Look For Requested ID
        foreach ($agents as $agent)
        {
            if (($this->agent_id != false) && (isset($agent['WTLUserID'])) && ($agent['WTLUserID'] != $this->agent_id))
            {
                continue; // You have specified a 
            }

            $properties = $this->getProperties($agent['WTLUserID']);

            $this->print_property_details($properties, $agent);
        }
    }

    /**
     * getProperties()
     */
    function getProperties($agent_id)
    {
        $url = $this->base_url.'/FeaturedDataHandler.c?DataType=3'.'&AgentID='.$agent_id.'&RotationType=1';

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        $response = curl_exec($ch);
        curl_close($ch);

        $json = json_decode($response);

        if (empty($response))
            die('No response 2'); //return false;
        else
            $json = $this->formatJSON($this->decode_json_string($response));

            var_dump($json);
            die();

            // return $json;
    }

    /**
     * print_property_details()
     */
    function print_property_details($properties, $agent, $html='')
    {
        $BASE_URL = $this->base_url;
        $PROPERTY_IMAGE_URL = $this->property_image_url;

        foreach ($properties as $property)
        {
            $img = $property['Image'];
            // $img = ($property['Image'] ? $property['Image'] : "some url to a dummy image here")

            if($property['ListingStatusCode'] != 'SOLD'){
                $address = $property['Address'];
                $shortaddr = substr($address, 0, -12);
                $html .= "<div class='listings'>";

                $html .= "<div class='property-image'>";
                $html .= "<img src='". $PROPERTY_IMAGE_URL ."' width='449' height='337' alt='' />";
                $html .= "</div>";
                $html .= "<div class='property-info'>";
                $html .= "<span class='property-price'>". $property['Price'] ."</span>";
                $html .= "<span class='property-street'>". $shortaddr ."</span>";
                $html .= "</div>";

                $html .= "<div class='agency'>";
                $html .= "<div class='agent'>";
                $html .= "<img src='". $agent['PhotoUrl']. "' class='agent-image' width='320' height='240' />";
                $html .= "<span class='agent-name'><b>Agent:</b>". $agent['DisplayName'] ."</span>";
                $html .= "</div>";
                $html .= "</div>";

                $html .= "</div>";
            }
        }
        echo $html;
    }

    function decode_json_string($json)
    {
        // Strip out junk
        $strip = array("{\"Agents\": [","{Props: ",",Success:true}",",\"Success\":true","\r","\n","[{","}]");
        $json = str_replace($strip,"",$json);

        // Instantiate array
        $json_array = array();

        foreach (explode("},{",$json) as $row)
        {
            /// Remove commas and colons between quotes
            if (preg_match_all('/"([^\\"]+)"/', $row, $match)) {
                foreach ($match as $m)
                {
                    $row = str_replace($m,str_replace(",","|comma|",$m),$row);
                    $row = str_replace($m,str_replace(":","|colon|",$m),$row);
                }
            }

            // Instantiate / clear array
            $array = array();

            foreach (explode(',',$row) as $pair)
            {
                $var = explode(":",$pair);

                // Add commas and colons back
                $val = str_replace("|colon|",":",$var[1]);
                $val = str_replace("|comma|",",",$val);
                $val = trim($val,'"');
                $val = trim($val);

                $key = trim($var[0]);
                $key = trim($key,'{');
                $key = trim($key,'}');

                $array[$key] = $val;
            }

            // Add to array
            $json_array[] = $array;
        }

        return $json_array;
    }
}

2 个答案:

答案 0 :(得分:0)

第二个URL上的

JSON不是有效的JSON,这就是为什么你没有收到结果,因为PHP无法decode进料。

我试图处理它,并收到此错误

  

错误:第1行的解析错误:   {道具:[{地址:“28    - ^   期待'STRING','}'

第一个网址的Feed图片

enter image description here

这是第二个网址的Feed

的视图

enter image description here

根据第二次Feed的错误,所有keys都应该包含在"内,因为它们是strings而不是CONSTANTS

e.g。 Props应该是"Props",也应该是function

修改

您需要更新formatJSON($json)并将此class添加到// Update this function, just need to update last line of function function getProperties($agent_id) { $url = $this->base_url.'/FeaturedDataHandler.c?DataType=3'.'&AgentID='.$agent_id.'&RotationType=1'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, 0); $response = curl_exec($ch); curl_close($ch); $json = json_decode($response); if (empty($response)) die('No response 2'); //return false; else return $this->formatJSON($this->decode_json_string($response)); //this one only need to be updated. } //add this function to class. This will format json private function formatJSON($json){ $from= array('Props:', 'Success:', 'Address:', ',Price:', 'PicTicks:', ',Image:', 'Link:', 'MissingImage:', 'ShowingCount:', 'ShowcaseHD:', 'ListingStatusCode:', 'Bedrooms:', 'Bathrooms:', 'IsSold:', 'ShowSoldPrice:', 'SqFootage:', 'YearBuilt:', 'Style:', 'PriceTypeDesc:'); $to = array('"Props":', '"Success":', '"Address":', ',"Price":', '"PicTicks":', ',"Image":', '"Link":', '"MissingImage":', '"ShowingCount":', '"ShowcaseHD":', '"ListingStatusCode":', '"Bedrooms":', '"Bathrooms":', '"IsSold":', '"ShowSoldPrice":', '"SqFootage":', '"YearBuilt":', '"Style":', '"PriceTypeDesc":' ); return str_ireplace($from, $to, $json); //returns the clean JSON }

decode_json_string($json)

修改

我已经测试过该功能,并且工作正常,可能是您的功能出现了问题json

我从第二个网址中删除了不清楚的json,并将其清除 here ,并将清除后的composer require mxkh/url-finder放入json编辑器中以检查其是否正常工作是否 HERE

答案 1 :(得分:0)

尝试使用此代码修复JSON:

$url = 'http://century21.ca/FeaturedDataHandler.c?DataType=3&AgentID=27830&RotationType=1';
$invalid_json = file_get_contents($url);
$json = preg_replace("/([{,])([a-zA-Z][^: ]+):/", "$1\"$2\":", $invalid_json);
var_dump($json);

所有密钥都需要双引号