EN
JavaScript - how to format json?
7 points
In this article, we're going to have a look at how to write own function to prettify json.
Quick solution:
xxxxxxxxxx
1
function prettifyJson(json, indent) {
2
var object = JSON.parse(json);
3
return JSON.stringify(object, null, indent || '\t');
4
}
5
6
7
// Usage example:
8
9
var uglyJson = '{"name":"John","age": 25,"todos":["Lectures","Classes"]}';
10
var preetyJson = prettifyJson(uglyJson, ' ');
11
12
console.log(preetyJson);
To format json we need to do 2 steps:
- parse JSON to object,
- render object back to JSON.
To write own object back to JSON renderer function we need to:
- iterate over objects and arrays,
- detect type of object,
- escape unsafe characters like newlines, backslashes, double quote marks, etc.
- join everything together using indents.
Practical example:
xxxxxxxxxx
1
var TO_STRING = Object.prototype.toString;
2
3
function escapeText(text) {
4
var result = '';
5
for (var i = 0; i < text.length; ++i) {
6
var code = text.charCodeAt(i);
7
switch (code) {
8
case 0x00: // \0 - NULL
9
case 0x01: case 0x02: case 0x03: case 0x04:
10
case 0x05: case 0x06: case 0x07: case 0x08:
11
continue;
12
case 0x09: // \t - TABULATOR
13
result += '\\t';
14
continue;
15
case 0x0A: // \n - NEW LINE
16
result += '\\n';
17
continue;
18
case 0x0B: case 0x0C:
19
continue;
20
case 0x0D: // \r - CARRIAGE RETURN
21
result += '\\r';
22
continue;
23
case 0x0E: case 0x0F: case 0x10: case 0x11:
24
case 0x12: case 0x13: case 0x14: case 0x15:
25
case 0x16: case 0x17: case 0x18: case 0x19:
26
case 0x1A: case 0x1B: case 0x1C: case 0x1D:
27
case 0x1E: case 0x1F:
28
continue;
29
// allowed characters: 0x20 and 0x21
30
case 0x22: // " - DOUBLE QUOTATION MARK
31
result += '\\"';
32
continue;
33
// allowed characters: 0x23 - 0x26
34
case 0x27: // ' - SINGLE QUOTATION MARK
35
result += '\'';
36
continue;
37
// allowed characters: 0x28 - 0x5B
38
case 0x5C: // \ - BACK SLASH
39
result += '\\\\';
40
continue;
41
default:
42
result += text[i];
43
}
44
}
45
return result;
46
}
47
48
function getType(object) {
49
return TO_STRING.call(object);
50
}
51
52
function prettifyArray(array, prefix, indent) {
53
let result = '[\n';
54
for (var i = 0; i < array.length; ++i) {
55
var value = prettifyEntry(array[i], prefix + indent, indent);
56
if (i > 0) {
57
result += ',\n'
58
}
59
result += prefix + indent + value;
60
}
61
return result + '\n' + prefix + ']';
62
}
63
64
function prettifyObject(object, prefix, indent) {
65
let result = '{\n';
66
for (var key in object) {
67
if (object.hasOwnProperty(key)) {
68
var name = escapeText(key);
69
var value = prettifyEntry(object[key], prefix + indent, indent);
70
if (result.length > 2) {
71
result += ',\n'
72
}
73
result += prefix + indent + '"' + name + '": ' + value;
74
}
75
}
76
return result + '\n' + prefix + '}';
77
}
78
79
function prettifyEntry(entry, prefix, indent) {
80
var type = getType(entry);
81
switch(type) {
82
case '[object Array]':
83
return prettifyArray(entry, prefix, indent);
84
case '[object Object]':
85
return prettifyObject(entry, prefix, indent);
86
case '[object Null]':
87
return null;
88
case '[object Boolean]':
89
case '[object Number]':
90
case '[object BigInt]':
91
return entry;
92
case '[object String]':
93
return '"' + escapeText(entry) + '"';
94
default:
95
throw new Error(type + ' type is not permitted in json.');
96
}
97
}
98
99
function prettifyJson(json, indent) {
100
var entry = JSON.parse(json);
101
return prettifyEntry(entry, '', indent || '\t');
102
}
103
104
105
// Usage example:
106
107
var indent = ' ';
108
109
var uglyJson = '{"name":"John","age": 25,"todos":["Lectures","Classes"]}';
110
var preetyJson = prettifyJson(uglyJson, indent);
111
112
console.log(preetyJson);
Note:
undefined
is not valid json token, this is the reasone why is not included in switch cases.