-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathJSONparser.js
More file actions
124 lines (113 loc) · 2.91 KB
/
JSONparser.js
File metadata and controls
124 lines (113 loc) · 2.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
var numberParser = function (input, numPattern = /^[-+]?(\d+(\.\d*)?|\.\d+)([e][+-]?\d+)?/) {
input = input.trim()
if (input.match(numPattern)) {
return [parseFloat(input.match(numPattern)[0]), input.slice(input.match(numPattern)[0].length)]
}
return null
}
var stringParser = function (input) {
input = input.trim()
if (input.startsWith('"') === false) return null
var end = input.slice(1).indexOf('"')
return [input.slice(1, end + 1), input.slice(end + 2)]
}
var booleanParser = function (input) {
input = input.trim()
if (input.startsWith('true')) {
return [true, input.slice(4)]
}
if (input.startsWith('false')) {
return [false, input.slice(5)]
}
return null
}
var nullParser = function (input) {
input = input.trim()
if (input.startsWith('null')) {
return [null, input.slice(4)]
}
return null
}
var commaParser = function (input) {
input = input.trim()
if (input.startsWith(',')) {
return [',', input.slice(1)]
}
return null
}
var colonParser = function (input) {
input = input.trim()
if (input.startsWith(':') === true) {
return [null, input.slice(1)]
}
return null
}
var arrayParser = function (input) {
if (input.startsWith('[') === false) return null
input = input.slice(1)
var array = []
var result, comma
while (true) {
input = input.trim()
result = valueParser(input)
// console.log(result)
if (result === null) return null
array.push(result[0])
input = result[1].trim()
comma = commaParser(input)
if (comma === null) break
input = comma[1]
}
input = input.trim()
if (input.startsWith(']') === true) {
return [array, input.slice(1)]
}
return null
}
var objectParser = function (input) {
input = input.trim()
var coma, res, key, value
if (input.startsWith('{') === false) return null
input = input.slice(1)
var object = {}
while (input) {
res = stringParser(input.trim())
if (res === null) break
key = res[0]
value = (res[1]).trim()
value = colonParser(value)
if (value === null) {
return null
}
value = (value[1]).trim()
value = valueParser(value)
if (value === null) return null
object[key] = value[0]
input = value[1]
coma = commaParser(input)
if (coma === null) break
input = coma[1]
}
if (input.startsWith('}') === true) {
return [object, input.slice(1)]
}
return null
}
var anyOneParserFactory = function (...parsers) {
return function (input) {
return parsers.reduce(function (accum, parser) {
if (accum === null) {
return parser(input)
} else return accum
},
null)
}
}
var valueParser = anyOneParserFactory(nullParser, booleanParser, numberParser, stringParser, arrayParser, objectParser)
var inp = require('fs').readFileSync('./example.json').toString()
var out = valueParser(inp)
if (out === null) {
console.log('INVALID JSON')
} else {
console.log(JSON.stringify(out[0], null, 2))
}