Skip to content

Instantly share code, notes, and snippets.

@gabmontes
Created December 6, 2016 17:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gabmontes/506b24b4ec43d7919f89c033190d7924 to your computer and use it in GitHub Desktop.
Save gabmontes/506b24b4ec43d7919f89c033190d7924 to your computer and use it in GitHub Desktop.
JsonParser coding exercise solution. 50 minutes to complete the exercise. Room for improvement? Definitely!
function JsonParser() {}
function convert(token, type) {
if (type === "number") {
return Number(token);
} else if (type === "string") {
return String(token);
}
}
function tokenize(str) {
var tokens = [];
var token = "";
var type = "";
str.split("").forEach(function (char) {
if (char === "[" || char === "{") {
tokens.push(char);
token = "";
type = "";
} else if (char === "," || char === ":") {
tokens.push(convert(token, type));
tokens.push(char);
token = "";
type = "";
} else if (char === "]" || char === "}") {
if (token) {
tokens.push(convert(token, type));
}
tokens.push(char);
token = "";
type = "";
} else if (/\d/.test(char) || char === ".") {
if (!token) {
type = "number";
}
token += char;
} else if (char === "\"") {
if (!token) {
type = "string";
}
} else {
token += char;
}
})
return tokens;
}
function buildArray(tokens) {
var result = [];
while (tokens.length) {
var token = tokens.shift();
if (token === "]") {
return result;
} else if (token != ",") {
result.push(token);
}
}
}
function buildObject(tokens) {
var result = {};
var key = "";
var value = "";
while (tokens.length) {
var token = tokens.shift();
if (token === "}" && !key) {
return result;
} else if (token === "}" && key) {
result[key] = value;
return result;
} else if (token === "," && key) {
result[key] = value;
key = "";
value = "";
} else if (!key) {
key = token;
} else if (token !== "" && key) {
tokens.unshift(token);
value = build(tokens);
}
}
}
function build(tokens) {
var token = tokens.shift()
if (token === "[") {
return buildArray(tokens);
} else if (token === "{") {
return buildObject(tokens);
} else {
return token;
}
}
JsonParser.prototype.parse = function(inputStr) {
var cleanStr = inputStr
.split(" ")
.filter(item => !!item)
.join("");
return build(tokenize(cleanStr));
}
function main() {
var jsonParser = new JsonParser();
console.log("First Step");
var result = jsonParser.parse(" [ 10, 20, 30.1 ] ");
for (var i = 0; i < result.length; i++) {
console.log(result[i]);
}
console.log("\nSecond Step");
result = jsonParser.parse(" [ 10 , 20, \"hello\", 30.1 ] ");
for (var i = 0; i < result.length; i++) {
console.log(result[i]);
}
result = jsonParser.parse('{ \
"hello": "world",\
"key1": 20,\
"key2": 20.3,\
"foo": "bar" }');
console.log("\nThird Step");
for (var key in result){
if (result.hasOwnProperty(key)) {
console.log(key, result[key]);
}
}
result = jsonParser.parse('{\
"hello": "world",\
"key1": 20,\
"key2": 20.3,\
"foo": {\
"hello1": "world1",\
"key3": [200, 300]\
} }');
console.log("\nFourth Step");
for (var key in result) {
if (result.hasOwnProperty(key)) {
if (result[key] instanceof Object) {
for (var key2 in result[key]) {
console.log(key2, result[key][key2]);
}
} else {
console.log(key, result[key]);
}
}
}
}
main();
// Please do not modify the following line.
var module = module || {};
module.exports = JsonParser;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment