I am using jQuery’s getJSON function to make a request and handle the JSON response. The problem is the response I get back is malformed and I can’t change it. The response looks something like this:
{
aNumber: 200,
someText: '\'hello\' world',
anObject: {
'foo': 'fooValue',
'bar': '10.0'
}
}
To be valid JSON, it should look like this:
{
"aNumber": 200,
"someText": "'hello' world",
"anObject": {
"foo": "fooValue",
"bar": "10.0"
}
}
I would like to change the text returned to a valid JSON object. I’ve used the JavaScript replace function to turn the single quotes into double quotes and the escaped single quotes into single quotes, but now I am stuck on figuring out the best way to add quotes around the key values.
For example, how would I change foo: "fooValue" to "foo":"fooValue"? Is there a Regular Expression that can make this easy?
Thanks in advance!
edit — came back to point out, first and foremost, that this is not a problem that can be solved with a regular expression.
It’s important to distinguish between JSON notation as a serialized form, and JavaScript object constant notation.
This:
is a perfectly valid JavaScript value (an expression fragment), so that this:
gives you exactly the same result as:
In other words, the value of “y” in either of those cases will be exactly the same. Completely, exactly the same, such that it would not be possible to ever tell which of those two constants was used to initialize “y”.
Now, if what you want to do is translate a string containing JavaScript style “JSON shorthand” without quotes into valid JSON, the only thing to do is parse it and reconstruct the string with quotes around the property names. That is, you will have to either write your own “relaxed” JSON parser than can cope with unquoted identifiers as property names, or else find an off-the-shelf parser that can handle such relaxed syntax.
In your case, it looks like once you have the “relaxed” parser available, you’re done; there shouldn’t be any need for you to translate back. Thankfully, your “invalid” JSON response is completely interpretable by JavaScript itself, so if you trust the data source (and that’s a big “if”) you should be able to evaluate it with “eval()”.