Skip to content

Instantly share code, notes, and snippets.

@lqt0223
Last active December 27, 2017 12:39
Show Gist options
  • Save lqt0223/aa9f0141ff3d230e206520597aaf27d4 to your computer and use it in GitHub Desktop.
Save lqt0223/aa9f0141ff3d230e206520597aaf27d4 to your computer and use it in GitHub Desktop.
19 JSON stringifier
function json_stringify(json, indent) {
var str = ''
var stack_dep = 0
function getSpaces(length) {
var spaces = new Array(length)
spaces.fill(' ')
return spaces.join('')
}
function stringifyElement(node) {
if (typeof node == 'number') {
return stringifyNumber(node)
} else if (typeof node == 'string') {
return stringifyString(node)
} else if (typeof node == 'boolean') {
return stringifyBoolean(node)
} else if (node === null) {
return stringifyNull(node)
} else if (node.constructor.name == 'Array') {
return stringifyArray(node)
} else if (typeof node == 'object' && node.constructor.name != 'Array') {
return stringifyObject(node)
}
}
function stringifyNumber(node) {
return node.toString()
}
function stringifyString(node) {
return '"' + node + '"'
}
function stringifyBoolean(node) {
return node.toString()
}
function stringifyNull(node) {
return 'null'
}
function stringifyArray(node) {
var str = '['
if (node.length > 0) {
stack_dep++
}
if (indent > 0) {
str += '\n'
}
for (var i = 0; i < node.length; i++) {
if (indent > 0) {
str += getSpaces(stack_dep * indent)
}
str += stringifyElement(node[i])
if ((indent > 0, i <= node.length - 2) || (!indent && i <= node.length - 1)) {
str += ","
}
if (indent > 0) {
str += '\n'
}
}
if (node.length > 0) {
stack_dep--
}
if (indent > 0) {
str += getSpaces(stack_dep * indent)
str += '\n'
}
str = str.slice(0, -1)
str += ']'
return str
}
function stringifyObject(node) {
var str = '{'
var keys = Object.keys(node)
if (keys.length > 0) {
stack_dep++
}
if (indent > 0) {
str += '\n'
}
for (var i = 0; i < keys.length; i++) {
var key = keys[i]
var value = node[key]
if (indent > 0) {
str += getSpaces(stack_dep * indent)
}
str += '"' + key + '"'
str += ":"
if (indent > 0) {
str += ' '
}
str += stringifyElement(value)
if ((indent > 0, i <= keys.length - 2) || (!indent && i <= keys.length - 1)) {
str += ","
}
if (indent > 0) {
str += '\n'
}
}
if (keys.length > 0) {
stack_dep--
}
if (indent > 0) {
str += getSpaces(stack_dep * indent)
str += '\n'
}
str = str.slice(0, -1)
str += "}"
return str
}
return stringifyElement(json)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment