Skip to content

Commit e34ac0d

Browse files
Split MustXXX
1 parent e244929 commit e34ac0d

File tree

4 files changed

+85
-32
lines changed

4 files changed

+85
-32
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
- Use bytes.IndexByte instead of Contains
66
- fix upstream #29
7+
- Split MustRepairJSON
78

89
## v0.0.5
910

go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
module github.com/RealAlexandreAI/json-repair
22

3-
go 1.18
3+
go 1.20

jsonrepair.go

+72-28
Original file line numberDiff line numberDiff line change
@@ -3,29 +3,73 @@ package jsonrepair
33
import (
44
"bytes"
55
"encoding/json"
6+
"fmt"
7+
"runtime/debug"
68
"strconv"
79
"strings"
810
"unicode"
911
)
1012

1113
// RepairJSON
1214
//
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
2467
}
2568

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
2973
}
3074

3175
// NewJSONParser
@@ -53,8 +97,8 @@ type JSONParser struct {
5397
//
5498
// Description:
5599
// receiver p
56-
// return interface{}
57-
func (p *JSONParser) parseJSON() interface{} {
100+
// return any
101+
func (p *JSONParser) parseJSON() any {
58102
c, b := p.getByte(0)
59103
if !b {
60104
return ""
@@ -100,9 +144,9 @@ func (p *JSONParser) parseJSON() interface{} {
100144
//
101145
// Description:
102146
// 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)
106150

107151
var c byte
108152
var b bool
@@ -173,9 +217,9 @@ func (p *JSONParser) parseObject() map[string]interface{} {
173217
//
174218
// Description:
175219
// 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)
179223
var c byte
180224
var b bool
181225

@@ -220,8 +264,8 @@ func (p *JSONParser) parseArray() []interface{} {
220264
// Description:
221265
// receiver p
222266
// param quotes
223-
// return interface{}
224-
func (p *JSONParser) parseString(quotes ...byte) interface{} {
267+
// return any
268+
func (p *JSONParser) parseString(quotes ...byte) any {
225269
fixedQuotes := false
226270
var lStringDelimiter, rStringDelimiter byte = '"', '"'
227271

@@ -319,8 +363,8 @@ func (p *JSONParser) parseString(quotes ...byte) interface{} {
319363
//
320364
// Description:
321365
// receiver p
322-
// return interface{}
323-
func (p *JSONParser) parseNumber() interface{} {
366+
// return any
367+
func (p *JSONParser) parseNumber() any {
324368
var rst []byte
325369
numberChars := []byte{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '.', 'e', 'E'}
326370

@@ -355,8 +399,8 @@ func (p *JSONParser) parseNumber() interface{} {
355399
//
356400
// Description:
357401
// receiver p
358-
// return interface{}
359-
func (p *JSONParser) parseBooleanOrNull() interface{} {
402+
// return any
403+
func (p *JSONParser) parseBooleanOrNull() any {
360404
ls := strings.ToLower(p.container[p.index:])
361405

362406
switch {

jsonrepair_test.go

+11-3
Original file line numberDiff line numberDiff line change
@@ -291,9 +291,17 @@ func Test_RepairJSON(t *testing.T) {
291291
caseNo := 0
292292
for _, tt := range tests {
293293
t.Run("CASE-"+strconv.Itoa(caseNo), func(t *testing.T) {
294-
got := RepairJSON(tt.in)
295-
if !jsonStringsEqual(got, tt.want) {
296-
t.Errorf("RepairJSON() = %v, want %v, param in is %v", got, tt.want, tt.in)
294+
got1, err := RepairJSON(tt.in)
295+
if err != nil {
296+
t.Fatal(err)
297+
}
298+
if !jsonStringsEqual(got1, tt.want) {
299+
t.Errorf("RepairJSON() = %v, want %v, param in is %v", got1, tt.want, tt.in)
300+
}
301+
302+
got2 := MustRepairJSON(tt.in)
303+
if !jsonStringsEqual(got2, tt.want) {
304+
t.Errorf("RepairJSON() = %v, want %v, param in is %v", got2, tt.want, tt.in)
297305
}
298306
})
299307
caseNo++

0 commit comments

Comments
 (0)