Sunday, May 19, 2024
 Popular · Latest · Hot · Upcoming
150
rated 0 times [  156] [ 6]  / answers: 1 / hits: 22403  / 11 Years ago, thu, april 25, 2013, 12:00:00

I have a NodeJS App that accepts a a string (uploaded input!) I have No Control over the input I am merely building a REST Service to Processes the data.



That string is meant to be an Array of JSON Objects that I can then loop through to extract each element ...



I'm receiving the following (as a string):



[
{Name: 'Jane',
Id: '005b0000000MGa7AAG'},
{Name: 'Tom',
Id: '005b0000000MGa7AAF'}
]


When I try to JSON.parse this I get



SyntaxError: Unexpected token N


Understandably so, because I know this is Invalid JSON



whereas This next string is valid JSON and passes http://jsonlint.com/:



[
{Name: Jack,
Id: 005b0000000MGa7AAA},
{Name: Jill,
Id: 005b0000000MGa7AAB}
]


My question is: How can I accept the first input and parse it to allow:



parsed[0]['Name'] == 'Jane'
>> true


My first instinct is to string replace the keys (e.g. Name to Name) and then try parsing it. But if anyone else has a solution, I'd be grateful.


More From » node.js

 Answers
44

You can do this with a bit of Regex replacing:



var json = [ {Name: 'Jane', Id: '005b0000000MGa7AAG'}, {Name: 'Tom', Id: '005b0000000MGa7AAF'} ];

var newJson = json.replace(/([a-zA-Z0-9]+?):/g, '$1:');
newJson = newJson.replace(/'/g, '');

var data = JSON.parse(newJson);

alert(data[0][Name]);


First of all we wrap the propertie names with quotes, then we replace the single-quotes with double-quotes. This is enough to make it valid JSON which can then be parsed.



Here is a working example






NOTE: Using RegEx in general for things like this is not ideal, and this solution will only work under specific circumstances (like this example). As mentioned in comments, one problem would be if the data values contained a colon :



With that in mind, this is a more reliable solution:



var json = $(div).html();

var newJson = json.replace(/'/g, '');

newJson = newJson.replace(/([^]+)|([^]+)/g, function($0, $1, $2) {
if ($1) {
return $1.replace(/([a-zA-Z0-9]+?):/g, '$1:');
} else {
return $2;
}
});

var data = JSON.parse(newJson);
alert(data[0][Name]);


This will match any variables (alphanumeric) that end with a colon :, but will ingore any matches that are found between quotes (i.e. data string values)



Here is an example


[#78630] Wednesday, April 24, 2013, 11 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
jillcalistay

Total Points: 561
Total Questions: 94
Total Answers: 114

Location: Austria
Member since Thu, Jan 7, 2021
3 Years ago
;