8

I'm getting errors, in both chrome and firefox developer tools, when trying to evaluate the following:

{
    "a": "",
    "b": ""
}

jsonlint.com tells me it's valid. Putting this code in an actual javascript file and running it works fine. The strangeness shows up only when I run this in the console in chrome developer tools or firebug. What's going on here?

Rob W
  • 341,306
  • 83
  • 791
  • 678
morgancodes
  • 25,055
  • 38
  • 135
  • 187
  • Works for me in Firebug, or at least, it will parse it if I assign that object to a variable. I get a different error just using the object entirely on its own. – Andrew Leach May 10 '12 at 16:07
  • possible duplicate of [Defining a JavaScript object in console](http://stackoverflow.com/questions/9082110/defining-a-javascript-object-in-console) – Rob W May 10 '12 at 16:11

2 Answers2

9

You can't execute JSON in the console. The JavaScript engine thinks its a block statement, with a label.

So this:

{
    "a": "", "b": ""
}

is interpreted as a block statement. The "a": part is interpreted as a label. The "", "b" part is interpreted as an expression (two string literals and a comma operator in-between). Now the second : character is invalid in that position... Next, the "a" is interpreted as a string literal, and the : is not valid at that position.

You work with JSON like so:

  1. You put it in a .json file,
  2. You retrieve it via Ajax as a string,
  3. You parse the string into an object with JSON.parse().

(You can also keep JSON data as a string in a variable, for instance, or in the localStorage object. Either way, in regard to JavaScript, JSON data should always come as a string value.)

Šime Vidas
  • 182,163
  • 62
  • 281
  • 385
  • Thank you sir, I was going bloody mad over that. had to assign it to a variable to get chrome to show it, `a = {"foo": "bar"}` – ThorSummoner Apr 29 '14 at 20:57
7

Actually, for one-off testing (my main use of the debug console), you can enter JSON object syntax, but you have to assign it to a variable:

> var x ={
    "a": "",
    "b": ""
  }
undefined

> x
Object
  a: ""
  b: ""
  __proto__: Object
Andy
  • 11,215
  • 5
  • 31
  • 33