470,855 Members | 1,220 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 470,855 developers. It's quick & easy.

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
Jun 2 '08 #1
7 2852
On Tue, 22 Apr 2008 20:32:28 +0200, Logos <ty*********@gmail.comwrote:
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
Jun 2 '08 #2
On Apr 22, 3:14 pm, "Rik Wasmus" <luiheidsgoe...@hotmail.comwrote:
On Tue, 22 Apr 2008 20:32:28 +0200, Logos <tyler.st...@gmail.comwrote:
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
Jun 2 '08 #3
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};
Jun 2 '08 #4
On Apr 23, 6:18 pm, Alexey Kulentsov <a...@inbox.ruwrote:
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
Jun 2 '08 #5
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
Jun 2 '08 #6
On Wed, 30 Apr 2008 03:39:16 +0200, Dave Benjamin
<ra***@lackingtalent.comwrote:
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
Jun 2 '08 #7
On Apr 29, 6:39 pm, Dave Benjamin <ra...@lackingtalent.comwrote:
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
Jun 2 '08 #8

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

16 posts views Thread by G Matthew J | last post: by
20 posts views Thread by Luke Matuszewski | last post: by
8 posts views Thread by Douglas Crockford | last post: by
3 posts views Thread by asleepatdesk | last post: by
23 posts views Thread by dhtmlkitchen | last post: by
3 posts views Thread by belred | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.