Using eval to parse a JSON text

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • radykl@gmail.com

    Using eval to parse a JSON text

    Can anyone explain me why you need to add open and close parenthesis to
    a JSON text in order to use eval() to parse it?
    For example:

    var json = "{a: 'abc', b: 'def'}";
    var obj1 = eval("(" + json + ")"); //ok!
    var obj2 = eval(json); //syntax error!

    why are parenthesis necessary?

    Thanks!

    /Andres.

  • RobG

    #2
    Re: Using eval to parse a JSON text


    radykl@gmail.co m wrote:[color=blue]
    > Can anyone explain me why you need to add open and close parenthesis to
    > a JSON text in order to use eval() to parse it?
    > For example:
    >
    > var json = "{a: 'abc', b: 'def'}";
    > var obj1 = eval("(" + json + ")"); //ok!
    > var obj2 = eval(json); //syntax error!
    >
    > why are parenthesis necessary?[/color]

    For the same reson as:

    {a: 'abc', b: 'def'};

    causes an error but:

    ( {a: 'abc', b: 'def'} );

    does not.

    When encountered on the left hand side, the punctuator '{' defines the
    start of a block statement, like if{... or while{... etc. The stuff
    inside the block is evaluated as if it were a series of statements, so
    the script engine attempts to evaluate:

    a: 'abc', b: 'def'

    and barfs (understandably ).

    By enclosing the expression in () it is evaluated as if it were the
    right hand side of an expression, in which case {} is treated as an
    object initialiser. So what you must pass to eval is:

    ( { /* property names & values */ } )

    as a literal string to force it to treat the {} as an object
    initialiser.


    --
    Rob

    Comment

    • Matt Kruse

      #3
      Re: Using eval to parse a JSON text

      radykl@gmail.co m wrote:[color=blue]
      > var json = "{a: 'abc', b: 'def'}";
      > var obj1 = eval("(" + json + ")"); //ok![/color]

      Rob already stated the reason. But I'm wondering why you wouldn't use
      eval("var obj1="+json);
      instead?

      --
      Matt Kruse




      Comment

      Working...