Tell me more ×
Stack Overflow is a question and answer site for professional and enthusiast programmers. It's 100% free, no registration required.

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.

share|improve this question
The user has to type the JSON? – Explosion Pills Apr 25 at 11:47
the first one is not in the json format – Wings Of Fire Apr 25 at 11:52
Hi @ExplosionPills I should have clarified that its a web-service that accepts JSON. The uploaded string is not hand-typed by the user instead it is generated by a JAVA App (out of my control) and sent to my NodeJS app for processing. They are sending me inValid JSON... :-( – nelsonic Apr 25 at 12:00

2 Answers

Create a javascript class, populate the object with your input and then convert it in a clean json using: JSON.stringify(object) to avoid errors . My full post here .

NOTE: if you use IE7 or less version you must add the JSON.js library to use JSON.stringify() function.

share|improve this answer
1  
IE8+ supports JSON.stringify. – GSerg Apr 25 at 12:58
i forget specify the version :P – Maximiliano Becerra Bustamante Apr 25 at 13:03
1  
This is the way to go. In the client stringify the object with JSON.stringify(). The server will receive a valid json. – Gabriel Llamas Apr 25 at 14:31
@MaximilianoBecerraBustamante My question has nothing to do with I.E or converting strings on the Client Side. I tried to make it clear in the question that I have no control over the input. I am receiving the data as a string so JSON.stringify(string) is useless to me... :-( – nelsonic Apr 25 at 16:03
@nelsonic Did you see my blog entry? JSON.stringify is the last step of the solution, the key of the proposed solution is create a javascript class ( could it be a complex object with many levels ) and then create a instance of that class and fill it with the data generated in the input (your data string). When you have your object ready and filled you may use JSON.stringify to generate your clean JSON based in a javascrit object (Constructed using a javascript class) :-) – Maximiliano Becerra Bustamante Apr 25 at 17:32
show 1 more comment

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

share|improve this answer
So no colons would be allowed inside data strings? – GSerg Apr 25 at 11:56
@GSerg: No, of course not, don't be silly! but yeah, it is definitely flaky, but if these assumptions can be made about the JSON data then it will be fine. – musefan Apr 25 at 11:57
@GSerg: Fixed it! – musefan Apr 25 at 12:06
@musefan thanks for your prompt and thorough reply! Some field names have underscores. e.g. Default__c (Salesforce Custom Fields!) but the regex does not like them. I need to allow for the "_c" or "" in field names. Thoughts? – nelsonic Apr 25 at 13:12
1  
@musefan agreed. the data is too complicated. I tried to phrase the question in a simple way. but given the URLs and data containing single quotes and colons etc. I am forced to be more creative. Thank you very much for your answer I will vote it up! – nelsonic Apr 25 at 15:56
show 3 more comments

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.