Skip to content

Instantly share code, notes, and snippets.

@allenkim67
Created March 9, 2016 09:10
Show Gist options
  • Save allenkim67/10c7c557480e0d9b246f to your computer and use it in GitHub Desktop.
Save allenkim67/10c7c557480e0d9b246f to your computer and use it in GitHub Desktop.
function tokenize(json) {
var regex = /(true|false|null|".*?[^\\]"|\d+|\[|\]|{|})/g
return json.match(regex);
}
function cast(data) {
if (typeof data === 'string') {
if (data.match(/".*?[^\\]"/)) { return data.slice(1, -1).replace(/\\/g, ""); }
if (data.match(/\d+/)) { return Number(data); }
if (data === 'true' || data == 'false') { return data === 'true'; }
if (data === 'null') { return null; }
}
return data;
}
function parse(json) {
var tokens = tokenize(json);
var stack = [];
tokens.forEach(function(token) {
if (token === ']') {
var parsedArray = [];
var latest = stack.pop();
while (latest !== '[') {
parsedArray.unshift(cast(latest));
latest = stack.pop();
}
stack.push(parsedArray);
} else if (token === '}') {
var parsedObject = {};
var value = stack.pop();
while (value !== '{') {
var key = stack.pop();
parsedObject[cast(key)] = cast(value);
value = stack.pop();
}
stack.push(parsedObject);
} else {
stack.push(token);
}
});
return cast(stack[0]);
}
//var string = JSON.stringify({x: [1,2,"3",[4,5, {a: 1},"hi", 6324], 'hello "fi"', [], [5], [1,[2,"3"]], "3"], y: 2});
var string = JSON.stringify('false "hi"');
console.log(string);
console.log(parse(string) == JSON.parse(string))
console.log(parse(string))
console.log(JSON.parse(string))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment