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&...
|
|||||||
| FAQ | Members List | Calendar | Search | Today's Posts | Mark Forums Read |
|
|||
|
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 |
|
|||
|
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 |
|
|||
|
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 |
|
|||
|
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}; |
|
|||
|
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 |
|
|||
|
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 |
|
|||
|
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 |
|
|||
|
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 |