JSON member access issue

This is a discussion on JSON member access issue within the PHP Language forums, part of the PHP Programming Forums category; I am using PHP with the JSON extension function json_decode. I have a JSON with a member named "1&...


Go Back   Usenet Forums > PHP Programming Forums > PHP Language

FAQ Members List Calendar Search Today's Posts Mark Forums Read
  #1 (permalink)  
Old 04-22-2008
Logos
 
Posts: n/a
Default JSON member access issue

I am using PHP with the JSON extension function json_decode.

I have a JSON with a member named "1" (ie) { "1":"somedata" }

Trying to access this via the -> operator doesn't work, nor does
["1"].

Putting the JSON into a foreach loop DOES access the member:

foreach($json as $key=>$value) {
echo("$key<br />");
}
//outputs '1'

Is this an error on my part, an oversight in the PHP JSON
implementation, or something else? Why can foreach grab the members,
but I can't access them?

Thanks for your time!

Tyler
Reply With Quote
  #2 (permalink)  
Old 04-22-2008
Rik Wasmus
 
Posts: n/a
Default Re: JSON member access issue

On Tue, 22 Apr 2008 20:32:28 +0200, Logos <tyler.style@gmail.com> wrote:

> I am using PHP with the JSON extension function json_decode.
>
> I have a JSON with a member named "1" (ie) { "1":"somedata" }
>
> Trying to access this via the -> operator doesn't work, nor does
> ["1"].
>
> Putting the JSON into a foreach loop DOES access the member:
>
> foreach($json as $key=>$value) {
> echo("$key<br />");
> }
> //outputs '1'
>
> Is this an error on my part, an oversight in the PHP JSON
> implementation, or something else? Why can foreach grab the members,
> but I can't access them?



The problem is that while json_decode is able to extract it:
object(stdClass)#1 (1) {
["1"]=>
string(8) "somedata"
}

"1" is not a valid property name to use directly.

Workarounds:
Option 1, suitable for single known variable:
<?php
$var = json_decode('{ "1":"somedata" }');
$name = '1';
echo $var->$name;
?>

Option 2, suited for more generic processing:
<?php
function json_object_to_named_array($var){
if(!is_object($var)){
trigger_error('No object given');
return;
}
$return = get_object_vars($var);
foreach($return as &$value){
if(is_object($value)) $value = json_object_to_named_array($value);
}
return $return;
}
$test = array('foo' => 'bar','foz' => array('fox' => 'bax'));
$json = json_encode($test);
var_dump($json);
$var = json_decode($json);
var_dump($var);
$var = json_object_to_named_array($var);
var_dump($var);
?>
Output:
string(33) "{"foo":"bar","foz":{"fox":"bax"}}"
object(stdClass)#1 (2) {
["foo"]=>
string(3) "bar"
["foz"]=>
object(stdClass)#2 (1) {
["fox"]=>
string(3) "bax"
}
}
array(2) {
["foo"]=>
string(3) "bar"
["foz"]=>
array(1) {
["fox"]=>
string(3) "bax"
}
}
--
Rik Wasmus
Reply With Quote
  #3 (permalink)  
Old 04-23-2008
Logos
 
Posts: n/a
Default Re: JSON member access issue

On Apr 22, 3:14 pm, "Rik Wasmus" <luiheidsgoe...@hotmail.com> wrote:
> On Tue, 22 Apr 2008 20:32:28 +0200, Logos <tyler.st...@gmail.com> wrote:
> > I am using PHP with the JSON extension function json_decode.

>
> > I have a JSON with a member named "1" (ie) { "1":"somedata" }

>
> > Trying to access this via the -> operator doesn't work, nor does
> > ["1"].

>
> > Putting the JSON into a foreach loop DOES access the member:

>
> > foreach($json as $key=>$value) {
> > echo("$key<br />");
> > }
> > //outputs '1'

>
> > Is this an error on my part, an oversight in the PHP JSON
> > implementation, or something else? Why can foreach grab the members,
> > but I can't access them?

>
> The problem is that while json_decode is able to extract it:
> object(stdClass)#1 (1) {
> ["1"]=>
> string(8) "somedata"
>
> }
>
> "1" is not a valid property name to use directly.
>
> Workarounds:
> Option 1, suitable for single known variable:
> <?php
> $var = json_decode('{ "1":"somedata" }');
> $name = '1';
> echo $var->$name;
> ?>
>
> Option 2, suited for more generic processing:
> <?php
> function json_object_to_named_array($var){
> if(!is_object($var)){
> trigger_error('No object given');
> return;
> }
> $return = get_object_vars($var);
> foreach($return as &$value){
> if(is_object($value)) $value = json_object_to_named_array($value);
> }
> return $return;}
>
> $test = array('foo' => 'bar','foz' => array('fox' => 'bax'));
> $json = json_encode($test);
> var_dump($json);
> $var = json_decode($json);
> var_dump($var);
> $var = json_object_to_named_array($var);
> var_dump($var);
> ?>
> Output:
> string(33) "{"foo":"bar","foz":{"fox":"bax"}}"
> object(stdClass)#1 (2) {
> ["foo"]=>
> string(3) "bar"
> ["foz"]=>
> object(stdClass)#2 (1) {
> ["fox"]=>
> string(3) "bax"
> }}
>
> array(2) {
> ["foo"]=>
> string(3) "bar"
> ["foz"]=>
> array(1) {
> ["fox"]=>
> string(3) "bax"
> }}
>
> --
> Rik Wasmus


Ah, I thought it might be something like that then. The JSON notation
is perfectly fine, but PHP's grammar won't let me directly access the
incompatible JSON format. I shall just have to live with it then.

Thanks!

Tyler
Reply With Quote
  #4 (permalink)  
Old 04-24-2008
Alexey Kulentsov
 
Posts: n/a
Default Re: JSON member access issue

Logos wrote:

> Ah, I thought it might be something like that then. The JSON notation
> is perfectly fine, but PHP's grammar won't let me directly access the
> incompatible JSON format. I shall just have to live with it then.


:)

Try echo $var->{1};
Reply With Quote
  #5 (permalink)  
Old 04-24-2008
Logos
 
Posts: n/a
Default Re: JSON member access issue

On Apr 23, 6:18 pm, Alexey Kulentsov <a...@inbox.ru> wrote:
> Logos wrote:
> > Ah, I thought it might be something like that then. The JSON notation
> > is perfectly fine, but PHP's grammar won't let me directly access the
> > incompatible JSON format. I shall just have to live with it then.

>
> :)
>
> Try echo $var->{1};


YOU, sirrah, are my HERO! Thank you much much much!!!

:D

Tyler
Reply With Quote
  #6 (permalink)  
Old 04-30-2008
Dave Benjamin
 
Posts: n/a
Default Re: JSON member access issue

Logos wrote:
> I am using PHP with the JSON extension function json_decode.
>
> I have a JSON with a member named "1" (ie) { "1":"somedata" }
>
> Trying to access this via the -> operator doesn't work, nor does
> ["1"].


Looks like you're already on your way, but just FYI, the json_decode
function takes an optional second argument that will, if true, cause
objects to be returned as associative arrays instead. Then, the usual
array notation (["1"]) should work.

Dave
Reply With Quote
  #7 (permalink)  
Old 04-30-2008
Rik Wasmus
 
Posts: n/a
Default Re: JSON member access issue

On Wed, 30 Apr 2008 03:39:16 +0200, Dave Benjamin
<ramen@lackingtalent.com> wrote:

> Logos wrote:
>> I am using PHP with the JSON extension function json_decode.
>> I have a JSON with a member named "1" (ie) { "1":"somedata" }
>> Trying to access this via the -> operator doesn't work, nor does
>> ["1"].

>
> Looks like you're already on your way, but just FYI, the json_decode
> function takes an optional second argument that will, if true, cause
> objects to be returned as associative arrays instead. Then, the usual
> array notation (["1"]) should work.


D'OH! Going through all that trouble writing a recursive function...
--
Rik Wasmus
Reply With Quote
  #8 (permalink)  
Old 05-02-2008
Logos
 
Posts: n/a
Default Re: JSON member access issue

On Apr 29, 6:39 pm, Dave Benjamin <ra...@lackingtalent.com> wrote:
> Logos wrote:
> > I am using PHP with the JSON extension function json_decode.

>
> > I have a JSON with a member named "1" (ie) { "1":"somedata" }

>
> > Trying to access this via the -> operator doesn't work, nor does
> > ["1"].

>
> Looks like you're already on your way, but just FYI, the json_decode
> function takes an optional second argument that will, if true, cause
> objects to be returned as associative arrays instead. Then, the usual
> array notation (["1"]) should work.
>
> Dave


Keen - I may try that too. Good to know for future reference, in any
event!

Tyler
Reply With Quote
Reply
Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are Off
[IMG] code is Off
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On



All times are GMT +1. The time now is 11:54 AM.


Powered by vBulletin® Version 3.7.3
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO 3.0.0