I am trying to implement a line chart using highcharts, in which I want to color specific points.
So I am using following statement.
JSON.parse("[{x: 1,y: 0},{x:2,y:5,marker:{fillColor:'red'}},{x:3,y:8}]");
to color the point (2,5) as red.
But, it is showing error as SyntaxError: JSON.parse: expected property name or '}'
Valid JSON strings require the property names to be quoted.
This can be corrected by quoting the property names like below:
JSON.parse('[{"x": 1, "y": 0}, {"x":2, "y":5, "marker": {"fillColor":"red"}}, {"x":3, "y":8}]');
As it was said earlier JSON object names must to be quoted. So JSON.parse will parse only that string, valid JSON.
But if you can't for any reason change format of your string you can also parse it using eval function which can accept your syntax. But be careful! That's pretty good way for exploit.
Related
When I try to JSON.parse("foo"), I get an Error:
Uncaught SyntaxError: Unexpected token o in JSON at position 1
at JSON.parse (<anonymous>)
at <anonymous>:1:6
But, when I use JSON.parse('"foo"'), I can get the result as expected:
const value = JSON.parse('"foo"');
console.log(value)
So why does this happen?
You can find what makes valid JSON at json.org. JSON can represent null, booleans, numbers, strings, arrays and objects. For strings, they must be enclosed in double quotes.
JSON itself is a string format, so when you specify a string in JSON format, you need:
quotes to tell JavaScript you are specifying a string literal. Those quotes are not part of the string value itself; they are just delimiters.
double-quotes inside that string literal to follow the JSON syntax for the string data type.
So here are some examples of correct arguments for JSON.parse:
JSON.parse("true")
JSON.parse("false")
JSON.parse("null")
JSON.parse("42")
JSON.parse("[13]")
JSON.parse('"hello"')
JSON.parse('{"name": "Mary"}')
But not:
JSON.parse("yes")
JSON.parse("no")
JSON.parse("none")
JSON.parse('hello')
JSON.parse({"name": "Mary"})
Because the argument will be cast to string when it is not, the following will also work, but it is confusing (and useless):
JSON.parse(true)
JSON.parse(false)
JSON.parse(null)
JSON.parse(42)
This happens because JSON.parse() gives a value back by formatting the string given using the syntaxis to declare values in Javascript. Therefore using foo naked would be like casting an undefined variable.
Notice also that the notation uses double quotes " instead of single ones '. That's why JSON.parse('"foo"') works but JSON.parse("'foo'") won't.
Looks pretty simple but I am unable to figure it out
var str="[{name:\"House\",id:\"1\"},{name:\"House and Land\",id:\"5\"},{name:\"Land\",id:\"6\"},{name:\"Terrace\",id:\"11\"}]";
JSON.parse(str.replace(/\s/g, "").replace(/\//g, ''));
I am unable to the convert above string(which comes from 3rd party website) to valid json so that I can iterate it on my side
error
VM5304:1 Uncaught SyntaxError: Unexpected token n in JSON at position 2
at JSON.parse (<anonymous>)
JSON requires the keys to be quoted. It appears that your keys are coming in unquoted. So add another .replace statement to insert the quote back in:
.replace(/(\w+):/g, '"$1":');
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON
Property names must be double-quoted strings; trailing commas are forbidden.
COMPLETE SOLUTION:
.replace(/(,|{)\s*(\w+)\s*:/g, '$1"$2":');
I have the Json data , which I am trying to parse in the following fiddle
but its throwing error
Uncaught SyntaxError: Unexpected token p in JSON at position 15
I am unable to paste the json here due to the large size kindly follow the fiddle
var varArray = JSON.parse(jsonData);
console.log(varArray);
Fiddle
https://jsfiddle.net/ffeLtaa6/
any suggestion ?
You have incorrectly wrapped parts of your JSON in quotes
[{"pricing":"{\"price\": ....
^
This shouldn't be here
...
.... \"standingCharge\": \"y\"}}"}]
^
This shouldn't be here
Alternatively, maybe you ARE supposed to have that part wrapped, but then you need to properly escape all backslashes within that part, i.e. \\ instead of just \.
In that case, when you do JSON.parse(jsonData) you would get objects (inside the array) that all have a single property, pricing, with a value that is itself a JSON string.
It looks like your JSON data has objects enclosed in quotations.
Take the error at position 15; The string up to that point as interpreted by parse() is:
[{"pricing":"{"
At this point your parse function is looking for a comma to continue with or end bracket to finish this object.
Now, if you skip down the string to position 3312, you'll see the character sequence }}"}. Those last two brackets match up the ones in the very beginning.
The format of your string should be [{"pricing":"{ ... }"}] if you want a string under "pricing", or [{"pricing":{" ... "}}] if you want the object representing that string.
Take a look at how the object you are JSON-ifying is being constructed, I get the feeling you may be doubling down somewhere on a stringify() function for the parent object members.
I had a the same error "Uncaught SyntaxError: Unexpected token P in JSON at position 0"
the code was working but this message was shown on console with status 200
in my case i managed to avoid the error message by changing the return type from String to Integer
like this:
//before
public String method(){
//code here
return "evrything went as expected";
}
//after
public Integer method(){
//code here
return 0;
}
I think this has something to do with the browser that is expecting to get integers, im gonna update this answer if i discover something else
So, I'm trying to parse some JSON in Javascript. This feels like it should work, but I'm getting an error. Here's the function call:
JSON.parse("{player: 'green', direction: 'north'}");
And here's the error
VM156:1 Uncaught SyntaxError: Unexpected token p in JSON at position 1
at Object.parse (native)
at <anonymous>:1:6
I'm trying this on an empty web page, no JS libraries are present.
The string, just executed as Javascript creates an object with the two expected attributes.
I've tried wrapping the keys in strings. That didn't parse.
The unexpected token appears to be whatever the first letter is.
What am I doing wrong, how can I parse this object?
That's not valid JSON.
Try this:
JSON.parse('{"player": "green", "direction": "north"}');
Note the double quotes " instead of single quotes ' and the quotes around the object keys.
Basically, I am trying to create an object like this by providing a string to JSON.parse():
a = {x:1}
// -> Object {x: 1}
Intuitively I tried:
a = JSON.parse('{x:1}')
// -> Uncaught SyntaxError: Unexpected token x
After some fiddling I figured out:
a = JSON.parse('{"x":1}')
// -> Object {x: 1}
But then I accidentally changed the syntax and bonus confusion kicked in:
a = JSON.parse("{'x':1}")
//-> Uncaught SyntaxError: Unexpected token '
So now I am looking for an explanation why
one must to quote the property name
the implementation accepts single quotes, but fails on double quotes
The main reason for confusion seems to be the difference between JSON and JavaScript objects.
JSON (JavaScript Object Notation) is a data format meant to allow data exchange in a simple format. That is the reason why there is one valid syntax only. It makes parsing much easier. You can find more information on the JSON website.
Some notes about JSON:
Keys must be quoted with "
Values might be strings, numbers, objects, arrays, booleans or "null"
String values must be quoted with "
JavaScript objects on the other hand are related to JSON (obviously), but not identical. Valid JSON is also a valid JavaScript object. The other way around, however, is not.
For example:
keys and values can be quoted with " or '
keys do not always have to be quoted
values might be functions or JavaScript objects
As pointed out in the comments, because that's what the JSON spec specifies. The reason AFAIK is that JSON is meant to be a data interchange format (language agnostic). Many languages, even those with hash literals, do not allow unquoted strings as hash table keys.