Created
March 9, 2016 09:10
-
-
Save allenkim67/10c7c557480e0d9b246f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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