Solved

can't work with a json returned string

Posted on 2013-11-09
16
447 Views
Last Modified: 2013-11-09
i have a json string i'm capturing form piwik analytics, for page hit

heres the data
a:1:{i:0;a:18:{s:5:"label";s:27:"/single_event_page.php?id=2";s:9:"nb_visits";i:1;s:7:"nb_hits";i:1;s:14:"sum_time_spent";i:714;s:28:"nb_hits_with_time_generation";s:1:"1";s:19:"min_time_generation";d:0.409999999999999975575093458246556110680103302001953125;s:19:"max_time_generation";d:0.409999999999999975575093458246556110680103302001953125;s:15:"entry_nb_visits";s:1:"1";s:16:"entry_nb_actions";s:1:"2";s:22:"entry_sum_visit_length";s:3:"715";s:18:"entry_bounce_count";s:1:"0";s:26:"sum_daily_nb_uniq_visitors";i:1;s:32:"sum_daily_entry_nb_uniq_visitors";i:1;s:16:"avg_time_on_page";d:714;s:11:"bounce_rate";s:2:"0%";s:9:"exit_rate";s:2:"0%";s:19:"avg_time_generation";d:0.409999999999999975575093458246556110680103302001953125;s:3:"url";s:52:"http://completelocal.info/single_event_page.php?id=2";}}

Open in new window


i've tried varous way to try and use this info and everything i try either is blank or null as a return so what am i doing wrong
im trying to see how many unique hits are on the page

heres my code i have
<?
//****************************************************************
// Filename..: __.php
// Author....: __
// Date......: mm/dd/yyyy
// Purpose...: __
// SQL.......: server/database/tables/tablename
//****************************************************************
// include("filename.php");

function prettyPrint( $json )
{
    $result = '';
    $level = 0;
    $prev_char = '';
    $in_quotes = false;
    $ends_line_level = NULL;
    $json_length = strlen( $json );

    for( $i = 0; $i < $json_length; $i++ ) {
        $char = $json[$i];
        $new_line_level = NULL;
        $post = "";
        if( $ends_line_level !== NULL ) {
            $new_line_level = $ends_line_level;
            $ends_line_level = NULL;
        }
        if( $char === '"' && $prev_char != '\\' ) {
            $in_quotes = !$in_quotes;
        } else if( ! $in_quotes ) {
            switch( $char ) {
                case '}': case ']':
                    $level--;
                    $ends_line_level = NULL;
                    $new_line_level = $level;
                    break;

                case '{': case '[':
                    $level++;
                case ',':
                    $ends_line_level = $level;
                    break;

                case ':':
                    $post = " ";
                    break;

                case " ": case "\t": case "\n": case "\r":
                    $char = "";
                    $ends_line_level = $new_line_level;
                    $new_line_level = NULL;
                    break;
            }
        }
        if( $new_line_level !== NULL ) {
            $result .= "\n".str_repeat( "\t", $new_line_level );
        }
        $result .= $char.$post;
        $prev_char = $char;
    }

    return $result;
}

$id ="2";
$url = "http://xxxx.xxx/analytics/index.php?module=API&method=Actions.getPageUrl&pageUrl=/single_event_page.php?id=" . $id . "&idSite=1&period=month&date=today&format=php&filter_limit=1&token_auth=0a653dd77008f450c5ca2493f4e9046c";
echo "url info: ".$url;
$page_hits_info = file_get_contents($url);
$contents = file_get_contents($url); 
$contents = utf8_encode($contents); 
$results = json_decode($contents);
echo "<br>";
$json=$results;
var_dump(json_decode($json));
echo "<br>";
var_dump(json_decode($json, true));
/**/

echo "<br>";
echo "<pre>";
var_dump($json);
echo "</pre>";


echo "<br> new <br>";
$id ="2";
$url = "http://xxxx.xxx/analytics/index.php?module=API&method=Actions.getPageUrl&pageUrl=/single_event_page.php?id=" . $id . "&idSite=1&period=month&date=today&format=php&filter_limit=1&token_auth=0a653dd77008f450c5ca2493f4e9046c";

$json_string = $url;
$jsondata = file_get_contents($json_string);
$obj = json_decode($jsondata);
echo "<pre>";
var_dump($obj);
echo "</pre>";



$json_data1='a:1:{i:0;a:18:{s:5:"label";s:27:"/single_event_page.php?id=2";s:9:"nb_visits";i:1;s:7:"nb_hits";i:1;s:14:"sum_time_spent";i:714;s:28:"nb_hits_with_time_generation";s:1:"1";s:19:"min_time_generation";d:0.409999999999999975575093458246556110680103302001953125;s:19:"max_time_generation";d:0.409999999999999975575093458246556110680103302001953125;s:15:"entry_nb_visits";s:1:"1";s:16:"entry_nb_actions";s:1:"2";s:22:"entry_sum_visit_length";s:3:"715";s:18:"entry_bounce_count";s:1:"0";s:26:"sum_daily_nb_uniq_visitors";i:1;s:32:"sum_daily_entry_nb_uniq_visitors";i:1;s:16:"avg_time_on_page";d:714;s:11:"bounce_rate";s:2:"0%";s:9:"exit_rate";s:2:"0%";s:19:"avg_time_generation";d:0.409999999999999975575093458246556110680103302001953125;s:3:"url";s:52:"http://xxxx.xxx/single_event_page.php?id=2";}';
$obj1 = json_decode($json_data1);
echo "<pre>";
var_dump($obj1);
echo "</pre>";


?>

Open in new window

note: i changed the domain name

thank you in advance for any code or help you may provide
0
Comment
Question by:Johnny
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 8
  • 7
16 Comments
 
LVL 58

Expert Comment

by:Gary
ID: 39636003
That is not valid JSON
0
 
LVL 35

Accepted Solution

by:
Robert Schutt earned 500 total points
ID: 39636004
That is not a json string.

One solution would be to change the requested format in your url, on line 87 change:
...&format=php&...

Open in new window

to
...&format=json&...

Open in new window

0
 
LVL 35

Expert Comment

by:Robert Schutt
ID: 39636129
I just tested out the other option, if you want to work with the current format (php serialized string), use unserialize instead of json_decode.

I only tried out the literal string, which needed some changes near the end to work:
$json_data1='a:1:{i:0;a:18:{s:5:"label";s:27:"/single_event_page.php?id=2";s:9:"nb_visits";i:1;s:7:"nb_hits";i:1;s:14:"sum_time_spent";i:714;s:28:"nb_hits_with_time_generation";s:1:"1";s:19:"min_time_generation";d:0.409999999999999975575093458246556110680103302001953125;s:19:"max_time_generation";d:0.409999999999999975575093458246556110680103302001953125;s:15:"entry_nb_visits";s:1:"1";s:16:"entry_nb_actions";s:1:"2";s:22:"entry_sum_visit_length";s:3:"715";s:18:"entry_bounce_count";s:1:"0";s:26:"sum_daily_nb_uniq_visitors";i:1;s:32:"sum_daily_entry_nb_uniq_visitors";i:1;s:16:"avg_time_on_page";d:714;s:11:"bounce_rate";s:2:"0%";s:9:"exit_rate";s:2:"0%";s:19:"avg_time_generation";d:0.409999999999999975575093458246556110680103302001953125;s:3:"url";s:42:"http://xxxx.xxx/single_event_page.php?id=2";}}'; // note changed s:52 to s:42 and added }

$obj1 = unserialize($json_data1);

echo "<pre>";
var_dump($obj1);
echo "</pre>";

Open in new window

You can see that it works on my site here: http://schutt.nl/ee/Q_28289970/
0
[Live Webinar] The Cloud Skills Gap

As Cloud technologies come of age, business leaders grapple with the impact it has on their team's skills and the gap associated with the use of a cloud platform.

Join experts from 451 Research and Concerto Cloud Services on July 27th where we will examine fact and fiction.

 

Author Comment

by:Johnny
ID: 39636130
i changed the output to json thanks for that
now how do i get the value please?
array(1) {
  [0]=>
  object(stdClass)#1 (18) {
    ["label"]=>
    string(27) "/single_event_page.php?id=2"
    ["nb_visits"]=>
    int(1)
    ["nb_hits"]=>
    int(1)
    ["sum_time_spent"]=>
    int(714)
    ["nb_hits_with_time_generation"]=>
    string(1) "1"
    ["min_time_generation"]=>
    float(0.41)
    ["max_time_generation"]=>
    float(0.41)
    ["entry_nb_visits"]=>
    string(1) "1"
    ["entry_nb_actions"]=>
    string(1) "2"
    ["entry_sum_visit_length"]=>
    string(3) "715"
    ["entry_bounce_count"]=>
    string(1) "0"
    ["sum_daily_nb_uniq_visitors"]=>
    int(1)
    ["sum_daily_entry_nb_uniq_visitors"]=>
    int(1)
    ["avg_time_on_page"]=>
    int(714)
    ["bounce_rate"]=>
    string(2) "0%"
    ["exit_rate"]=>
    string(2) "0%"
    ["avg_time_generation"]=>
    float(0.41)
    ["url"]=>
    string(52) "http://completelocal.info/single_event_page.php?id=2"
  }
}

Open in new window


echo "page hits: ".$page_hits['0']['nb_hits'];

Open in new window


does not seam to work
0
 

Author Comment

by:Johnny
ID: 39636146
echo "page hits: ".$page_hits['0'];

Open in new window

returns


Catchable fatal error: Object of class stdClass could not be converted to string in /home/local/public_html/page_hits.php on line 80

so how do i get the nb hits please??
0
 
LVL 35

Expert Comment

by:Robert Schutt
ID: 39636149
That can have a number of reasons, for starters there is no $page_hits variable in your original posted code so can you check that and if it's there now please show your current code?
0
 

Author Comment

by:Johnny
ID: 39636152
<?
//****************************************************************
// Filename..: __.php
// Author....: __
// Date......: mm/dd/yyyy
// Purpose...: __
// SQL.......: server/database/tables/tablename
//****************************************************************
// include("filename.php");

function prettyPrint( $json )
{
    $result = '';
    $level = 0;
    $prev_char = '';
    $in_quotes = false;
    $ends_line_level = NULL;
    $json_length = strlen( $json );

    for( $i = 0; $i < $json_length; $i++ ) {
        $char = $json[$i];
        $new_line_level = NULL;
        $post = "";
        if( $ends_line_level !== NULL ) {
            $new_line_level = $ends_line_level;
            $ends_line_level = NULL;
        }
        if( $char === '"' && $prev_char != '\\' ) {
            $in_quotes = !$in_quotes;
        } else if( ! $in_quotes ) {
            switch( $char ) {
                case '}': case ']':
                    $level--;
                    $ends_line_level = NULL;
                    $new_line_level = $level;
                    break;

                case '{': case '[':
                    $level++;
                case ',':
                    $ends_line_level = $level;
                    break;

                case ':':
                    $post = " ";
                    break;

                case " ": case "\t": case "\n": case "\r":
                    $char = "";
                    $ends_line_level = $new_line_level;
                    $new_line_level = NULL;
                    break;
            }
        }
        if( $new_line_level !== NULL ) {
            $result .= "\n".str_repeat( "\t", $new_line_level );
        }
        $result .= $char.$post;
        $prev_char = $char;
    }

    return $result;
}

$id ="2";
$url = "http:/xxx.xxx/analytics/index.php?module=API&method=Actions.getPageUrl&pageUrl=/single_event_page.php?id=" . $id . "&idSite=1&period=month&date=today&format=json&filter_limit=1&token_auth=0a653dd77008f450c5ca2493f4e9046c";
echo "url info: ".$url;


$json_string = $url;
$jsondata = file_get_contents($json_string);
$page_hits = json_decode($jsondata);
echo "<pre>";
echo prettyPrint($jsondata);
echo "</pre>";
echo "<pre>";
var_dump($page_hits);
echo "</pre>";


echo "<pre>";
var_dump($page_hits['0']['stdClass']);
echo "</pre>";

echo "page hits: ".$page_hits['0']['stdClass']['nb_hits'];







?>

Open in new window

opps sorry forgot that part
0
 
LVL 35

Expert Comment

by:Robert Schutt
ID: 39636157
could you also please post the json string because it could be slightly different than the unserialized php string I have now.
0
 
LVL 35

Expert Comment

by:Robert Schutt
ID: 39636170
As an aside, after unserializing the string you posted before, the following code works:
echo "nb_hits: ".$obj1[0]['nb_hits'];

Open in new window

0
 

Author Comment

by:Johnny
ID: 39636176
[{"label":"\/single_event_page.php?id=2","nb_visits":1,"nb_hits":1,"sum_time_spent":714,"nb_hits_with_time_generation":"1","min_time_generation":0.41,"max_time_generation":0.41,"entry_nb_visits":"1","entry_nb_actions":"2","entry_sum_visit_length":"715","entry_bounce_count":"0","sum_daily_nb_uniq_visitors":1,"sum_daily_entry_nb_uniq_visitors":1,"avg_time_on_page":714,"bounce_rate":"0%","exit_rate":"0%","avg_time_generation":0.41,"url":"http:\/\/xxx.xxx\/single_event_page.php?id=2"}]

Open in new window

0
 
LVL 35

Expert Comment

by:Robert Schutt
ID: 39636187
Ok, I'll have a look. In the mean time, another question...

Your posted code has an extra bit in it:
['stdClass']

Open in new window

Which is not present in the posts where you ask how to get to the info. Is that part of the problem?
0
 

Author Comment

by:Johnny
ID: 39636190

Your posted code has an extra bit in it: ['stdClass']

no idea i get it if i var_dump it
0
 

Author Comment

by:Johnny
ID: 39636195
$json_string = $url;
$jsondata = file_get_contents($json_string);
$page_hits = json_decode($jsondata);

echo "<pre>";
var_dump($page_hits);
echo "</pre>";

Open in new window

outputs
array(1) {
  [0]=>
  object(stdClass)#1 (18) {
    ["label"]=>
    string(27) "/single_event_page.php?id=2"
    ["nb_visits"]=>
    int(1)
    ["nb_hits"]=>
    int(1)
    ["sum_time_spent"]=>
    int(714)
    ["nb_hits_with_time_generation"]=>
    string(1) "1"
    ["min_time_generation"]=>
    float(0.41)
    ["max_time_generation"]=>
    float(0.41)
    ["entry_nb_visits"]=>
    string(1) "1"
    ["entry_nb_actions"]=>
    string(1) "2"
    ["entry_sum_visit_length"]=>
    string(3) "715"
    ["entry_bounce_count"]=>
    string(1) "0"
    ["sum_daily_nb_uniq_visitors"]=>
    int(1)
    ["sum_daily_entry_nb_uniq_visitors"]=>
    int(1)
    ["avg_time_on_page"]=>
    int(714)
    ["bounce_rate"]=>
    string(2) "0%"
    ["exit_rate"]=>
    string(2) "0%"
    ["avg_time_generation"]=>
    float(0.41)
    ["url"]=>
    string(52) "http://xxxxx/single_event_page.php?id=2"
  }
}

Open in new window

0
 
LVL 35

Assisted Solution

by:Robert Schutt
Robert Schutt earned 500 total points
ID: 39636196
This seems to do the trick:
$obj = $page_hits[0];
echo "page hits: ".$obj->nb_hits;

Open in new window

0
 
LVL 35

Expert Comment

by:Robert Schutt
ID: 39636201
quick check to loop over all items:
foreach ($page_hits[0] as $key => $val) {
    echo "$key: $val<br>";
}

Open in new window

You can see the output here: http://schutt.nl/ee/Q_28289970/index2.php
0
 

Author Closing Comment

by:Johnny
ID: 39636210
Thank so much
0

Featured Post

Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Foreword (July, 2015) Since I first wrote this article, years ago, a great many more people have begun using the internet.  They are coming online from every part of the globe, learning, reading, shopping and spending money at an ever-increasing ra…
Things That Drive Us Nuts Have you noticed the use of the reCaptcha feature at EE and other web sites?  It wants you to read and retype something that looks like this. Insanity!  It's not EE's fault - that's just the way reCaptcha works.  But it i…
The viewer will learn how to dynamically set the form action using jQuery.
The viewer will learn how to create and use a small PHP class to apply a watermark to an image. This video shows the viewer the setup for the PHP watermark as well as important coding language. Continue to Part 2 to learn the core code used in creat…

624 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question