1
2
3
4
5
6
7 package json
8
9
10
11
12
13
14
15
16
17
18 import (
19 "strconv"
20 "sync"
21 )
22
23
24 func Valid(data []byte) bool {
25 scan := newScanner()
26 defer freeScanner(scan)
27 return checkValid(data, scan) == nil
28 }
29
30
31
32
33 func checkValid(data []byte, scan *scanner) error {
34 scan.reset()
35 for _, c := range data {
36 scan.bytes++
37 if scan.step(scan, c) == scanError {
38 return scan.err
39 }
40 }
41 if scan.eof() == scanError {
42 return scan.err
43 }
44 return nil
45 }
46
47
48
49 type SyntaxError struct {
50 msg string
51 Offset int64
52 }
53
54 func (e *SyntaxError) Error() string { return e.msg }
55
56
57
58
59
60
61
62
63
64
65
66
67
68 type scanner struct {
69
70
71
72
73 step func(*scanner, byte) int
74
75
76 endTop bool
77
78
79 parseState []int
80
81
82 err error
83
84
85
86 bytes int64
87 }
88
89 var scannerPool = sync.Pool{
90 New: func() any {
91 return &scanner{}
92 },
93 }
94
95 func newScanner() *scanner {
96 scan := scannerPool.Get().(*scanner)
97
98 scan.bytes = 0
99 scan.reset()
100 return scan
101 }
102
103 func freeScanner(scan *scanner) {
104
105 if len(scan.parseState) > 1024 {
106 scan.parseState = nil
107 }
108 scannerPool.Put(scan)
109 }
110
111
112
113
114
115
116
117
118 const (
119
120 scanContinue = iota
121 scanBeginLiteral
122 scanBeginObject
123 scanObjectKey
124 scanObjectValue
125 scanEndObject
126 scanBeginArray
127 scanArrayValue
128 scanEndArray
129 scanSkipSpace
130
131
132 scanEnd
133 scanError
134 )
135
136
137
138
139
140 const (
141 parseObjectKey = iota
142 parseObjectValue
143 parseArrayValue
144 )
145
146
147
148 const maxNestingDepth = 10000
149
150
151
152 func (s *scanner) reset() {
153 s.step = stateBeginValue
154 s.parseState = s.parseState[0:0]
155 s.err = nil
156 s.endTop = false
157 }
158
159
160
161 func (s *scanner) eof() int {
162 if s.err != nil {
163 return scanError
164 }
165 if s.endTop {
166 return scanEnd
167 }
168 s.step(s, ' ')
169 if s.endTop {
170 return scanEnd
171 }
172 if s.err == nil {
173 s.err = &SyntaxError{"unexpected end of JSON input", s.bytes}
174 }
175 return scanError
176 }
177
178
179
180 func (s *scanner) pushParseState(c byte, newParseState int, successState int) int {
181 s.parseState = append(s.parseState, newParseState)
182 if len(s.parseState) <= maxNestingDepth {
183 return successState
184 }
185 return s.error(c, "exceeded max depth")
186 }
187
188
189
190 func (s *scanner) popParseState() {
191 n := len(s.parseState) - 1
192 s.parseState = s.parseState[0:n]
193 if n == 0 {
194 s.step = stateEndTop
195 s.endTop = true
196 } else {
197 s.step = stateEndValue
198 }
199 }
200
201 func isSpace(c byte) bool {
202 return c <= ' ' && (c == ' ' || c == '\t' || c == '\r' || c == '\n')
203 }
204
205
206 func stateBeginValueOrEmpty(s *scanner, c byte) int {
207 if isSpace(c) {
208 return scanSkipSpace
209 }
210 if c == ']' {
211 return stateEndValue(s, c)
212 }
213 return stateBeginValue(s, c)
214 }
215
216
217 func stateBeginValue(s *scanner, c byte) int {
218 if isSpace(c) {
219 return scanSkipSpace
220 }
221 switch c {
222 case '{':
223 s.step = stateBeginStringOrEmpty
224 return s.pushParseState(c, parseObjectKey, scanBeginObject)
225 case '[':
226 s.step = stateBeginValueOrEmpty
227 return s.pushParseState(c, parseArrayValue, scanBeginArray)
228 case '"':
229 s.step = stateInString
230 return scanBeginLiteral
231 case '-':
232 s.step = stateNeg
233 return scanBeginLiteral
234 case '0':
235 s.step = state0
236 return scanBeginLiteral
237 case 't':
238 s.step = stateT
239 return scanBeginLiteral
240 case 'f':
241 s.step = stateF
242 return scanBeginLiteral
243 case 'n':
244 s.step = stateN
245 return scanBeginLiteral
246 }
247 if '1' <= c && c <= '9' {
248 s.step = state1
249 return scanBeginLiteral
250 }
251 return s.error(c, "looking for beginning of value")
252 }
253
254
255 func stateBeginStringOrEmpty(s *scanner, c byte) int {
256 if isSpace(c) {
257 return scanSkipSpace
258 }
259 if c == '}' {
260 n := len(s.parseState)
261 s.parseState[n-1] = parseObjectValue
262 return stateEndValue(s, c)
263 }
264 return stateBeginString(s, c)
265 }
266
267
268 func stateBeginString(s *scanner, c byte) int {
269 if isSpace(c) {
270 return scanSkipSpace
271 }
272 if c == '"' {
273 s.step = stateInString
274 return scanBeginLiteral
275 }
276 return s.error(c, "looking for beginning of object key string")
277 }
278
279
280
281 func stateEndValue(s *scanner, c byte) int {
282 n := len(s.parseState)
283 if n == 0 {
284
285 s.step = stateEndTop
286 s.endTop = true
287 return stateEndTop(s, c)
288 }
289 if isSpace(c) {
290 s.step = stateEndValue
291 return scanSkipSpace
292 }
293 ps := s.parseState[n-1]
294 switch ps {
295 case parseObjectKey:
296 if c == ':' {
297 s.parseState[n-1] = parseObjectValue
298 s.step = stateBeginValue
299 return scanObjectKey
300 }
301 return s.error(c, "after object key")
302 case parseObjectValue:
303 if c == ',' {
304 s.parseState[n-1] = parseObjectKey
305 s.step = stateBeginString
306 return scanObjectValue
307 }
308 if c == '}' {
309 s.popParseState()
310 return scanEndObject
311 }
312 return s.error(c, "after object key:value pair")
313 case parseArrayValue:
314 if c == ',' {
315 s.step = stateBeginValue
316 return scanArrayValue
317 }
318 if c == ']' {
319 s.popParseState()
320 return scanEndArray
321 }
322 return s.error(c, "after array element")
323 }
324 return s.error(c, "")
325 }
326
327
328
329
330 func stateEndTop(s *scanner, c byte) int {
331 if !isSpace(c) {
332
333 s.error(c, "after top-level value")
334 }
335 return scanEnd
336 }
337
338
339 func stateInString(s *scanner, c byte) int {
340 if c == '"' {
341 s.step = stateEndValue
342 return scanContinue
343 }
344 if c == '\\' {
345 s.step = stateInStringEsc
346 return scanContinue
347 }
348 if c < 0x20 {
349 return s.error(c, "in string literal")
350 }
351 return scanContinue
352 }
353
354
355 func stateInStringEsc(s *scanner, c byte) int {
356 switch c {
357 case 'b', 'f', 'n', 'r', 't', '\\', '/', '"':
358 s.step = stateInString
359 return scanContinue
360 case 'u':
361 s.step = stateInStringEscU
362 return scanContinue
363 }
364 return s.error(c, "in string escape code")
365 }
366
367
368 func stateInStringEscU(s *scanner, c byte) int {
369 if '0' <= c && c <= '9' || 'a' <= c && c <= 'f' || 'A' <= c && c <= 'F' {
370 s.step = stateInStringEscU1
371 return scanContinue
372 }
373
374 return s.error(c, "in \\u hexadecimal character escape")
375 }
376
377
378 func stateInStringEscU1(s *scanner, c byte) int {
379 if '0' <= c && c <= '9' || 'a' <= c && c <= 'f' || 'A' <= c && c <= 'F' {
380 s.step = stateInStringEscU12
381 return scanContinue
382 }
383
384 return s.error(c, "in \\u hexadecimal character escape")
385 }
386
387
388 func stateInStringEscU12(s *scanner, c byte) int {
389 if '0' <= c && c <= '9' || 'a' <= c && c <= 'f' || 'A' <= c && c <= 'F' {
390 s.step = stateInStringEscU123
391 return scanContinue
392 }
393
394 return s.error(c, "in \\u hexadecimal character escape")
395 }
396
397
398 func stateInStringEscU123(s *scanner, c byte) int {
399 if '0' <= c && c <= '9' || 'a' <= c && c <= 'f' || 'A' <= c && c <= 'F' {
400 s.step = stateInString
401 return scanContinue
402 }
403
404 return s.error(c, "in \\u hexadecimal character escape")
405 }
406
407
408 func stateNeg(s *scanner, c byte) int {
409 if c == '0' {
410 s.step = state0
411 return scanContinue
412 }
413 if '1' <= c && c <= '9' {
414 s.step = state1
415 return scanContinue
416 }
417 return s.error(c, "in numeric literal")
418 }
419
420
421
422 func state1(s *scanner, c byte) int {
423 if '0' <= c && c <= '9' {
424 s.step = state1
425 return scanContinue
426 }
427 return state0(s, c)
428 }
429
430
431 func state0(s *scanner, c byte) int {
432 if c == '.' {
433 s.step = stateDot
434 return scanContinue
435 }
436 if c == 'e' || c == 'E' {
437 s.step = stateE
438 return scanContinue
439 }
440 return stateEndValue(s, c)
441 }
442
443
444
445 func stateDot(s *scanner, c byte) int {
446 if '0' <= c && c <= '9' {
447 s.step = stateDot0
448 return scanContinue
449 }
450 return s.error(c, "after decimal point in numeric literal")
451 }
452
453
454
455 func stateDot0(s *scanner, c byte) int {
456 if '0' <= c && c <= '9' {
457 return scanContinue
458 }
459 if c == 'e' || c == 'E' {
460 s.step = stateE
461 return scanContinue
462 }
463 return stateEndValue(s, c)
464 }
465
466
467
468 func stateE(s *scanner, c byte) int {
469 if c == '+' || c == '-' {
470 s.step = stateESign
471 return scanContinue
472 }
473 return stateESign(s, c)
474 }
475
476
477
478 func stateESign(s *scanner, c byte) int {
479 if '0' <= c && c <= '9' {
480 s.step = stateE0
481 return scanContinue
482 }
483 return s.error(c, "in exponent of numeric literal")
484 }
485
486
487
488
489 func stateE0(s *scanner, c byte) int {
490 if '0' <= c && c <= '9' {
491 return scanContinue
492 }
493 return stateEndValue(s, c)
494 }
495
496
497 func stateT(s *scanner, c byte) int {
498 if c == 'r' {
499 s.step = stateTr
500 return scanContinue
501 }
502 return s.error(c, "in literal true (expecting 'r')")
503 }
504
505
506 func stateTr(s *scanner, c byte) int {
507 if c == 'u' {
508 s.step = stateTru
509 return scanContinue
510 }
511 return s.error(c, "in literal true (expecting 'u')")
512 }
513
514
515 func stateTru(s *scanner, c byte) int {
516 if c == 'e' {
517 s.step = stateEndValue
518 return scanContinue
519 }
520 return s.error(c, "in literal true (expecting 'e')")
521 }
522
523
524 func stateF(s *scanner, c byte) int {
525 if c == 'a' {
526 s.step = stateFa
527 return scanContinue
528 }
529 return s.error(c, "in literal false (expecting 'a')")
530 }
531
532
533 func stateFa(s *scanner, c byte) int {
534 if c == 'l' {
535 s.step = stateFal
536 return scanContinue
537 }
538 return s.error(c, "in literal false (expecting 'l')")
539 }
540
541
542 func stateFal(s *scanner, c byte) int {
543 if c == 's' {
544 s.step = stateFals
545 return scanContinue
546 }
547 return s.error(c, "in literal false (expecting 's')")
548 }
549
550
551 func stateFals(s *scanner, c byte) int {
552 if c == 'e' {
553 s.step = stateEndValue
554 return scanContinue
555 }
556 return s.error(c, "in literal false (expecting 'e')")
557 }
558
559
560 func stateN(s *scanner, c byte) int {
561 if c == 'u' {
562 s.step = stateNu
563 return scanContinue
564 }
565 return s.error(c, "in literal null (expecting 'u')")
566 }
567
568
569 func stateNu(s *scanner, c byte) int {
570 if c == 'l' {
571 s.step = stateNul
572 return scanContinue
573 }
574 return s.error(c, "in literal null (expecting 'l')")
575 }
576
577
578 func stateNul(s *scanner, c byte) int {
579 if c == 'l' {
580 s.step = stateEndValue
581 return scanContinue
582 }
583 return s.error(c, "in literal null (expecting 'l')")
584 }
585
586
587
588 func stateError(s *scanner, c byte) int {
589 return scanError
590 }
591
592
593 func (s *scanner) error(c byte, context string) int {
594 s.step = stateError
595 s.err = &SyntaxError{"invalid character " + quoteChar(c) + " " + context, s.bytes}
596 return scanError
597 }
598
599
600 func quoteChar(c byte) string {
601
602 if c == '\'' {
603 return `'\''`
604 }
605 if c == '"' {
606 return `'"'`
607 }
608
609
610 s := strconv.Quote(string(c))
611 return "'" + s[1:len(s)-1] + "'"
612 }
613
View as plain text