View Single Post

  #2 (permalink)  
Old 04-23-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