JSON member access issue

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Logos

    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":"someda ta" }

    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
  • Rik Wasmus

    #2
    Re: JSON member access issue

    On Tue, 22 Apr 2008 20:32:28 +0200, Logos <tyler.style@gm ail.comwrote:
    I am using PHP with the JSON extension function json_decode.
    >
    I have a JSON with a member named "1" (ie) { "1":"someda ta" }
    >
    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":"someda ta" }');
    $name = '1';
    echo $var->$name;
    ?>

    Option 2, suited for more generic processing:
    <?php
    function json_object_to_ named_array($va r){
    if(!is_object($ var)){
    trigger_error(' No object given');
    return;
    }
    $return = get_object_vars ($var);
    foreach($return as &$value){
    if(is_object($v alue)) $value = json_object_to_ named_array($va lue);
    }
    return $return;
    }
    $test = array('foo' ='bar','foz' =array('fox' ='bax'));
    $json = json_encode($te st);
    var_dump($json) ;
    $var = json_decode($js on);
    var_dump($var);
    $var = json_object_to_ named_array($va r);
    var_dump($var);
    ?>
    Output:
    string(33) "{"foo":"bar"," foz":{"fox":"ba x"}}"
    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

    Comment

    • Logos

      #3
      Re: JSON member access issue

      On Apr 22, 3:14 pm, "Rik Wasmus" <luiheidsgoe... @hotmail.comwro te:
      On Tue, 22 Apr 2008 20:32:28 +0200, Logos <tyler.st...@gm ail.comwrote:
      I am using PHP with the JSON extension function json_decode.
      >
      I have a JSON with a member named "1" (ie) { "1":"someda ta" }
      >
      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":"someda ta" }');
      $name = '1';
      echo $var->$name;
      ?>
      >
      Option 2, suited for more generic processing:
      <?php
      function json_object_to_ named_array($va r){
      if(!is_object($ var)){
      trigger_error(' No object given');
      return;
      }
      $return = get_object_vars ($var);
      foreach($return as &$value){
      if(is_object($v alue)) $value = json_object_to_ named_array($va lue);
      }
      return $return;}
      >
      $test = array('foo' ='bar','foz' =array('fox' ='bax'));
      $json = json_encode($te st);
      var_dump($json) ;
      $var = json_decode($js on);
      var_dump($var);
      $var = json_object_to_ named_array($va r);
      var_dump($var);
      ?>
      Output:
      string(33) "{"foo":"bar"," foz":{"fox":"ba x"}}"
      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

      Comment

      • Alexey Kulentsov

        #4
        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};

        Comment

        • Logos

          #5
          Re: JSON member access issue

          On Apr 23, 6:18 pm, Alexey Kulentsov <a...@inbox.ruw rote:
          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

          Comment

          • Dave Benjamin

            #6
            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":"someda ta" }
            >
            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

            Comment

            • Rik Wasmus

              #7
              Re: JSON member access issue

              On Wed, 30 Apr 2008 03:39:16 +0200, Dave Benjamin
              <ramen@lackingt alent.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":"someda ta" }
              > 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

              Comment

              • Logos

                #8
                Re: JSON member access issue

                On Apr 29, 6:39 pm, Dave Benjamin <ra...@lackingt alent.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":"someda ta" }
                >
                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

                Comment

                Working...