I have an invalid json string like following,
"{one: 'one', two: 'two'}"
I tried to use JSON.parse to convert it to an object. however, this is not valid json string.
Is there any functions can convert this invalid format into a valid json string or directly convert into an object?
IF your example syntax is the same as your real JSON, JSONLint says you need double quote for the name AND the value.
In this case only, use these replace calls:
var jsontemp = yourjson.replace((/([\w]+)(:)/g), "\"$1\"$2");
var correctjson = jsontemp.replace((/'/g), "\"");
//yourjson = "{one: 'one', two: 'two'}"
//jsontemp = "{"one": 'one', "two": 'two'}"
//correctjson = "{"one": "one", "two": "two"}"
However you should try to work with a valid Json in the first place.
If the question is "can I convert invalid JSON into valid JSON", in the general case the answer is obviously "no"; where would you even start with a string like "$#!~~"?
In this particular case, the JSON is only invalid because the property names are not quoted; as JavaScript, the string is valid and could be parsed using, for example,
var myObj = eval( "x=" + myString );
or better
var myObj = (new Function("return " + myString))();
However, this is potentially very unsafe and you should not do it unless you are positive the string cannot cause harm (which seems unlikely if you aren't in a position to generate valid JSON in the first place). It also won't help you if the JSON code is invalid in other ways, and it will fail if the property names are not valid JS identifiers.
For a proper answer it would be useful to know more about the context of this question.
Related
I have a string that looks like this:
"{""c1"": ""value1"", ""c2"": ""value2""}"
As you can notice, it is in JSON format. I store it in an SQLITE database, and then I use the following Javascript code to get it again in JSON format :
var req= "SELECT json_column from my_table";
var result = execSQL(req);
for (var index in res) {
var row= res[index];
consoleLog("test getad ", JSON.parse(row["json_column "]));
But I get this error :
<JSContext: 0x1c0044aa0> SyntaxError: JSON Parse error: Expected '}'
Can you please tell me why I have this error, I've spent hours trying to resolve it but with no success. I can change the string format if it is necessary, all I need is to get it again from SQLITE as JSON object.
Thank you in advance.
That string of yours is not valid JSON, this one is, based on your string content.
'{"c1": "value1", "c2": "value2"}'
As you can see the key/value pair is surrounded with one double quote ", not two, and the whole string with single quotes '. If the whole string would use double quote, the inner one's would needed to be escaped, like this
"{\"c1\": \"value1\", \"c2\": \"value2\"}"
For further reading about JSON, this post has a lot
What is the correct JSON content type?
Here is a sample showing their output
// these gets properly printed
// correct formatted JSON
console.log( JSON.parse('{"c1": "value1", "c2": "value2"}') );
// correct formatted JSON, outer doulbe quotes and inner, escaped one's
console.log( JSON.parse("{\"c1\": \"value1\", \"c2\": \"value2\"}") );
// yours wrapped with single quotes and inner double quotes, changed to one
console.log( JSON.parse('{""c1"": ""value1"", ""c2"": ""value2""}'.replace(/""/g, '"')) );
// these generates script error
// yours wrapped with single quotes
console.log( JSON.parse('{""c1"": ""value1"", ""c2"": ""value2""}') );
// yours as is, and had to comment this out, as if not, it crashes itself and all the above
//console.log( JSON.parse("{""c1"": ""value1"", ""c2"": ""value2""}") );
Your string is not in the right format. That is why the JSON.parse() cannot read it.
Your string:
"{""c1"": ""value1"", ""c2"": ""value2""}"
Try making it like this:
'{"c1": "value1", "c2": "value2"}'
I have a string that looks like this:
{"name":"Bob","age":20}###{"name":"Brian","age":12}###{"name":"Ryan","age":19}
As you can see, they JSON-like strings are demarcated by ###
My JS Code looks like this:
var data = <above string passed in from a function>
var data_list = data.split('###'); //should return an array with 3 JSON strings
Now I am trying to parse them individually like this:
console.log(JSON.parse(data_list[0])) // returns [object Object]
console.log(JSON.parse(data_list[1])) // returns [object Object]
BUT, the last one:
console.log(JSON.parse(data_list[2])) // Fails
Error:
Invalid JSON: <json>:28:1 Expected eof but found
}
^ in <eval> at line number 28
ALSO:
I printed out the contents of each index from the data_list array and they are valid JSON as per jsonlint.com
As per Bergi's comments I was able to replace the \u0000\u0000\u0000\u0000 using replace(/\0/g, '') and the JSON is now valid. Thanks Bergi!
You could try this code, to transform that string into an array of JSON objects.
var array = [];
var uniqueString = '[' + data.replaceAll('###', ', ') + ']';
array = JSON.parse(uniqueString);
Now 'array' is an array of JSON parsed object, so you should be able to obtain something like this.
array[0] will be '{"name": "Bob", "age": 20}'
please check your data string, it may have some invisible character as #Bergi said.
I already check by pasting your string as below.
var sample = '{"name":"Bob","age":20}###{"name":"Brian","age":12}###{"name":"Ryan","age":19}';
var data_str = sample.split('###');
console.log(JSON.parse(data_str[0]));
console.log(JSON.parse(data_str[1]));
console.log(JSON.parse(data_str[2]));
Output Was on console::
Object {name: "Bob", age: 20}
VM981:4 Object {name: "Brian", age: 12}
VM981:5 Object {name: "Ryan", age: 19}
While the bane of a programmer's existence are quotes, i.e. single vs double and when to use which, the issue here concerns the integrity of the data. One may note that the numbers in the string are unquoted, but that is okay -- still valid JSON; see this discussion. The actual problem stems from the data being tainted with trailing unseen null characters. One may cleanse the data with a simple regex as in the attached example.
var data = '{"name":"Bob","age":20}###{"name":"Brian","age":12}###{"name":"Ryan","age":19}\u0000\u0000\u0000\u0000';
var clean_data = data.replace(/\u0000/g,"");
var data_list = clean_data.split('###');
console.log(JSON.parse(data_list[0]))
console.log(JSON.parse(data_list[1]))
console.log(JSON.parse(data_list[2]))
See this discussion
One needs to exercise caution before accepting data as valid regardless as to the source. If a string happens to acquire one or more characters detrimental to JSON, such as null or vertical tab characters, the data becomes compromised. One should assume the data is tainted until proven otherwise. A regex that replaces any occurrences of such characters helps ensure the validity of the data. Whether those characters are represented in unicode or as escape codes is immaterial. The important point is to replace any such occurrences with empty strings; see here.
In my application when I enter value as my"name in text field the framework makes a String like (this i can not control):
"[{\"id\":\"201500000001002\",\"name\":\"my\"name\",\"colorCode\":\"\",\"version\":\"11\",\"nodeOrder\":\"1\"}]"
Now this String is passed to JSON.parse() method which produces an error because of ambiguous name field as
\"name\":\"my\"name\"
var str = JSON.parse("[{\"id\":\"201500000001002\",\"name\":\"my\"name\",\"colorCode\":\"\",\"version\":\"11\",\"nodeOrder\":\"1\"}]")
This results in JSON exception
Is there anything I can do with the string:
"[{\"id\":\"201500000001002\",\"name\":\"my\"name\",\"colorCode\":\"\",\"version\":\"11\",\"nodeOrder\":\"1\"}]"
To escape double quote character in my " name as my \" name to make it valid for JSON.parse method.
I can not control JSON String, I am just passing name as my"name and framework creates a String which is passed to JSON.parse()
I went through a series of text replace. You can try this:
var str = "[{\"id\":\"201500000001002\",\"name\":\"my\"name\",\"colorCode\":\"\",\"version\":\"11\",\"nodeOrder\":\"1\"}]";
JSON.parse(
str.replace(/\\/i,"").
replace(/{"/g,"{'").
replace(/":"/g,"':'").
replace(/","/g,"','").
replace(/"}/g,"'}").
replace(/'/g,"\###").
replace(/"/g,"\\\"").
replace(/###/g,"\"")
);
It will give back your desired JSON array
var str = "[{\"id\":\"201500000001002\"}]";
str.replace("\"*","\\\"");
var obj = JSON.parse(str);
I have this variable which is json-like string, error appear while parse to a object
"SyntaxError: JSON.parse: expected ',' or '}' after property value in object"
Code:
var obj = JSON.parse('{"data":[{"from":"{\"category\":\"Bank/financial institution\"}"}],"statusCode":200}');
Seems the function not available for nested "{\"category\":\"Bank/financial institution\"}", replace with simple text (e.g. "123") would be fine, is there any way to handle such cases? Thanks.
The \ (backslash) character before "category is unnecessary.
There's no need to escape a double quote in a single-quoted string.
Your string is indeed malformed.
You either want:
var obj = JSON.parse('{"data":[{"from":{"category":"Bank/financial institution"}}],"statusCode":200}');
...(e.g., without quotes around the value of from and without backslashes) which when deserialized results in an object with a property called data which is an array, which has as its first entry an object with a property called from which is an object: Live Example | Source
or
var obj = JSON.parse('{"data":[{"from":"{\\"category\\":\\"Bank/financial institution\\"}"}],"statusCode":200}');
...(e.g., keeping the quotes around the value for from and making sure the backslashes appear in the JSON, which means escaping them) which is the same until you get to from, which is a string: Live Example | Source
Remove quots for inner object
var obj = {
"data": [{
"from": {
"category": "Bank/financial institution"
}
}],
"statusCode": 200
}
I have the following json object
"phrase": "{subject: Hello}"
When I access "phrase" it returns "{subject: Hello}" as a string but I want this string to be converted to json object.
There is a function called JSON.parse to convert things from strings to objects but I am not sure it would apply to your case, since you have invalid JSON (the "Hello" not being quoted is a bid deal and the "subject" not being quoted is a bad sign)
If it's a Javascript object literal, just remove the quotation marks when you create it:
var phrase = { subject: "Hello" };
If it's a JSON string that is parsed, change the string to an object:
{ "phrase": { "subject": "Hello" } }
If you have a variable that contains a JSON string, you need to make it valid JSON to parse it:
var phrase = '{ "subject": "Hello" }';
var obj = JSON.parse(phrase);
You can also parse the string as Javascript, which has a more relaxed syntax. The string value needs delimiters though:
var phrase = '{ subject: "Hello" }';
var obj = eval(phrase);
Note that the eval function actually executes the string as javascript, so you need to know where the string value comes from for this to be safe.
Use JSON.parse():
var obj = {myObj:"{\"this\":\"that\"}"};
obj.myObj = JSON.parse(obj.myObj);
alert(obj.myObj["this"]);
Here is the demo.
you could use native JSON parsing with JSON.parse(jsonString);
(Edit: assuming to have a valid JSON object)