@@ -3,29 +3,73 @@ package jsonrepair
3
3
import (
4
4
"bytes"
5
5
"encoding/json"
6
+ "fmt"
7
+ "runtime/debug"
6
8
"strconv"
7
9
"strings"
8
10
"unicode"
9
11
)
10
12
11
13
// RepairJSON
12
14
//
13
- // Description:
14
- // param in
15
- // return string
16
- func RepairJSON (in string ) string {
17
- in = strings .TrimSpace (in )
18
- in = strings .TrimPrefix (in , "```json" )
19
-
20
- if json .Valid ([]byte (in )) {
21
- dst := & bytes.Buffer {}
22
- json .Compact (dst , []byte (in ))
23
- return dst .String ()
15
+ // @Description:
16
+ // @param src
17
+ // @return dst
18
+ // @return err
19
+ func RepairJSON (src string ) (dst string , err error ) {
20
+ defer func () {
21
+ if errR := recover (); errR != nil {
22
+ stack := string (debug .Stack ())
23
+ err = fmt .Errorf ("repair json panic: %s" , stack )
24
+ return
25
+ }
26
+ }()
27
+
28
+ src = strings .TrimSpace (src )
29
+ src = strings .TrimPrefix (src , "```json" )
30
+
31
+ if json .Valid ([]byte (src )) {
32
+ buf := & bytes.Buffer {}
33
+ if err = json .Compact (buf , []byte (src )); err != nil {
34
+ return "" , err
35
+ }
36
+ dst = buf .String ()
37
+ return
38
+ }
39
+
40
+ jp := NewJSONParser (src )
41
+ bs , err := json .Marshal (jp .parseJSON ())
42
+ dst = string (bs )
43
+ return
44
+ }
45
+
46
+ // MustRepairJSON
47
+ //
48
+ // @Description:
49
+ // @param src
50
+ // @return dst
51
+ func MustRepairJSON (src string ) (dst string ) {
52
+ defer func () {
53
+ if errR := recover (); errR != nil {
54
+ dst = ""
55
+ return
56
+ }
57
+ }()
58
+
59
+ src = strings .TrimSpace (src )
60
+ src = strings .TrimPrefix (src , "```json" )
61
+
62
+ if json .Valid ([]byte (src )) {
63
+ buf := & bytes.Buffer {}
64
+ json .Compact (buf , []byte (src ))
65
+ dst = buf .String ()
66
+ return
24
67
}
25
68
26
- jp := NewJSONParser (in )
27
- marshal , _ := json .Marshal (jp .parseJSON ())
28
- return string (marshal )
69
+ jp := NewJSONParser (src )
70
+ bs , _ := json .Marshal (jp .parseJSON ())
71
+ dst = string (bs )
72
+ return
29
73
}
30
74
31
75
// NewJSONParser
@@ -53,8 +97,8 @@ type JSONParser struct {
53
97
//
54
98
// Description:
55
99
// receiver p
56
- // return interface{}
57
- func (p * JSONParser ) parseJSON () interface {} {
100
+ // return any
101
+ func (p * JSONParser ) parseJSON () any {
58
102
c , b := p .getByte (0 )
59
103
if ! b {
60
104
return ""
@@ -100,9 +144,9 @@ func (p *JSONParser) parseJSON() interface{} {
100
144
//
101
145
// Description:
102
146
// receiver p
103
- // return map[string]interface{}
104
- func (p * JSONParser ) parseObject () map [string ]interface {} {
105
- rst := make (map [string ]interface {} )
147
+ // return map[string]any
148
+ func (p * JSONParser ) parseObject () map [string ]any {
149
+ rst := make (map [string ]any )
106
150
107
151
var c byte
108
152
var b bool
@@ -173,9 +217,9 @@ func (p *JSONParser) parseObject() map[string]interface{} {
173
217
//
174
218
// Description:
175
219
// receiver p
176
- // return []interface{}
177
- func (p * JSONParser ) parseArray () []interface {} {
178
- rst := make ([]interface {} , 0 )
220
+ // return []any
221
+ func (p * JSONParser ) parseArray () []any {
222
+ rst := make ([]any , 0 )
179
223
var c byte
180
224
var b bool
181
225
@@ -220,8 +264,8 @@ func (p *JSONParser) parseArray() []interface{} {
220
264
// Description:
221
265
// receiver p
222
266
// param quotes
223
- // return interface{}
224
- func (p * JSONParser ) parseString (quotes ... byte ) interface {} {
267
+ // return any
268
+ func (p * JSONParser ) parseString (quotes ... byte ) any {
225
269
fixedQuotes := false
226
270
var lStringDelimiter , rStringDelimiter byte = '"' , '"'
227
271
@@ -319,8 +363,8 @@ func (p *JSONParser) parseString(quotes ...byte) interface{} {
319
363
//
320
364
// Description:
321
365
// receiver p
322
- // return interface{}
323
- func (p * JSONParser ) parseNumber () interface {} {
366
+ // return any
367
+ func (p * JSONParser ) parseNumber () any {
324
368
var rst []byte
325
369
numberChars := []byte {'0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' , '-' , '.' , 'e' , 'E' }
326
370
@@ -355,8 +399,8 @@ func (p *JSONParser) parseNumber() interface{} {
355
399
//
356
400
// Description:
357
401
// receiver p
358
- // return interface{}
359
- func (p * JSONParser ) parseBooleanOrNull () interface {} {
402
+ // return any
403
+ func (p * JSONParser ) parseBooleanOrNull () any {
360
404
ls := strings .ToLower (p .container [p .index :])
361
405
362
406
switch {
0 commit comments