Skip to content

Commit 6240e1e

Browse files
committed
#185 add jsoniter.Valid
1 parent 0149a5c commit 6240e1e

9 files changed

+36
-17
lines changed

feature_adapter.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,3 +125,8 @@ func (adapter *Encoder) SetEscapeHTML(escapeHTML bool) {
125125
config.EscapeHTML = escapeHTML
126126
adapter.stream.cfg = config.Froze().(*frozenConfig)
127127
}
128+
129+
// Valid reports whether data is a valid JSON encoding.
130+
func Valid(data []byte) bool {
131+
return ConfigDefault.Valid(data)
132+
}

feature_config.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ type API interface {
4545
Get(data []byte, path ...interface{}) Any
4646
NewEncoder(writer io.Writer) *Encoder
4747
NewDecoder(reader io.Reader) *Decoder
48+
Valid(data []byte) bool
4849
}
4950

5051
// ConfigDefault the default API
@@ -333,3 +334,10 @@ func (cfg *frozenConfig) NewDecoder(reader io.Reader) *Decoder {
333334
iter := Parse(cfg, reader, 512)
334335
return &Decoder{iter}
335336
}
337+
338+
func (cfg *frozenConfig) Valid(data []byte) bool {
339+
iter := cfg.BorrowIterator(data)
340+
defer cfg.ReturnIterator(iter)
341+
iter.Skip()
342+
return iter.Error == nil
343+
}

feature_iter.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ func (iter *Iterator) ReportError(operation string, msg string) {
215215
}
216216
context := string(iter.buf[contextStart:contextEnd])
217217
iter.Error = fmt.Errorf("%s: %s, error found in #%v byte of ...|%s|..., bigger context ...|%s|...",
218-
operation, msg, iter.head - peekStart, parsing, context)
218+
operation, msg, iter.head-peekStart, parsing, context)
219219
}
220220

221221
// CurrentBuffer gets current buffer as string for debugging purpose

feature_iter_array.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ func (iter *Iterator) ReadArrayCB(callback func(*Iterator) bool) (ret bool) {
4242
c = iter.nextToken()
4343
}
4444
if c != ']' {
45-
iter.ReportError("ReadArrayCB", "expect ] in the end, but found " + string([]byte{c}))
45+
iter.ReportError("ReadArrayCB", "expect ] in the end, but found "+string([]byte{c}))
4646
return false
4747
}
4848
return true

feature_iter_object.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ func (iter *Iterator) ReadObject() (ret string) {
2424
if c == '}' {
2525
return "" // end of object
2626
}
27-
iter.ReportError("ReadObject", `expect " after {, but found ` + string([]byte{c}))
27+
iter.ReportError("ReadObject", `expect " after {, but found `+string([]byte{c}))
2828
return
2929
case ',':
3030
return string(iter.readObjectFieldAsBytes())
@@ -105,14 +105,14 @@ func (iter *Iterator) ReadObjectCB(callback func(*Iterator, string) bool) bool {
105105
if c == '}' {
106106
return true
107107
}
108-
iter.ReportError("ReadObjectCB", `expect " after }, but found ` + string([]byte{c}))
108+
iter.ReportError("ReadObjectCB", `expect " after }, but found `+string([]byte{c}))
109109
return false
110110
}
111111
if c == 'n' {
112112
iter.skipThreeBytes('u', 'l', 'l')
113113
return true // null
114114
}
115-
iter.ReportError("ReadObjectCB", `expect { or n, but found ` + string([]byte{c}))
115+
iter.ReportError("ReadObjectCB", `expect { or n, but found `+string([]byte{c}))
116116
return false
117117
}
118118

@@ -125,7 +125,7 @@ func (iter *Iterator) ReadMapCB(callback func(*Iterator, string) bool) bool {
125125
iter.unreadByte()
126126
field := iter.ReadString()
127127
if iter.nextToken() != ':' {
128-
iter.ReportError("ReadMapCB", "expect : after object field, but found " + string([]byte{c}))
128+
iter.ReportError("ReadMapCB", "expect : after object field, but found "+string([]byte{c}))
129129
return false
130130
}
131131
if !callback(iter, field) {
@@ -135,7 +135,7 @@ func (iter *Iterator) ReadMapCB(callback func(*Iterator, string) bool) bool {
135135
for c == ',' {
136136
field = iter.ReadString()
137137
if iter.nextToken() != ':' {
138-
iter.ReportError("ReadMapCB", "expect : after object field, but found " + string([]byte{c}))
138+
iter.ReportError("ReadMapCB", "expect : after object field, but found "+string([]byte{c}))
139139
return false
140140
}
141141
if !callback(iter, field) {
@@ -152,14 +152,14 @@ func (iter *Iterator) ReadMapCB(callback func(*Iterator, string) bool) bool {
152152
if c == '}' {
153153
return true
154154
}
155-
iter.ReportError("ReadMapCB", `expect " after }, but found ` + string([]byte{c}))
155+
iter.ReportError("ReadMapCB", `expect " after }, but found `+string([]byte{c}))
156156
return false
157157
}
158158
if c == 'n' {
159159
iter.skipThreeBytes('u', 'l', 'l')
160160
return true // null
161161
}
162-
iter.ReportError("ReadMapCB", `expect { or n, but found ` + string([]byte{c}))
162+
iter.ReportError("ReadMapCB", `expect { or n, but found `+string([]byte{c}))
163163
return false
164164
}
165165

@@ -176,7 +176,7 @@ func (iter *Iterator) readObjectStart() bool {
176176
iter.skipThreeBytes('u', 'l', 'l')
177177
return false
178178
}
179-
iter.ReportError("readObjectStart", "expect { or n, but found " + string([]byte{c}))
179+
iter.ReportError("readObjectStart", "expect { or n, but found "+string([]byte{c}))
180180
return false
181181
}
182182

@@ -192,7 +192,7 @@ func (iter *Iterator) readObjectFieldAsBytes() (ret []byte) {
192192
}
193193
}
194194
if iter.buf[iter.head] != ':' {
195-
iter.ReportError("readObjectFieldAsBytes", "expect : after object field, but found " + string([]byte{iter.buf[iter.head]}))
195+
iter.ReportError("readObjectFieldAsBytes", "expect : after object field, but found "+string([]byte{iter.buf[iter.head]}))
196196
return
197197
}
198198
iter.head++

feature_iter_skip.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ func (iter *Iterator) ReadBool() (ret bool) {
2525
iter.skipFourBytes('a', 'l', 's', 'e')
2626
return false
2727
}
28-
iter.ReportError("ReadBool", "expect t or f, but found " + string([]byte{c}))
28+
iter.ReportError("ReadBool", "expect t or f, but found "+string([]byte{c}))
2929
return
3030
}
3131

feature_iter_string.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ func (iter *Iterator) ReadString() (ret string) {
2828
iter.skipThreeBytes('u', 'l', 'l')
2929
return ""
3030
}
31-
iter.ReportError("ReadString", `expects " or n, but found ` + string([]byte{c}))
31+
iter.ReportError("ReadString", `expects " or n, but found `+string([]byte{c}))
3232
return
3333
}
3434

@@ -139,7 +139,7 @@ func (iter *Iterator) ReadStringAsSlice() (ret []byte) {
139139
}
140140
return copied
141141
}
142-
iter.ReportError("ReadStringAsSlice", `expects " or n, but found ` + string([]byte{c}))
142+
iter.ReportError("ReadStringAsSlice", `expects " or n, but found `+string([]byte{c}))
143143
return
144144
}
145145

@@ -156,7 +156,7 @@ func (iter *Iterator) readU4() (ret rune) {
156156
} else if c >= 'A' && c <= 'F' {
157157
ret = ret*16 + rune(c-'A'+10)
158158
} else {
159-
iter.ReportError("readU4", "expects 0~9 or a~f, but found " + string([]byte{c}))
159+
iter.ReportError("readU4", "expects 0~9 or a~f, but found "+string([]byte{c}))
160160
return
161161
}
162162
}

feature_reflect_native.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -608,7 +608,7 @@ type stringModeNumberDecoder struct {
608608
func (decoder *stringModeNumberDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
609609
c := iter.nextToken()
610610
if c != '"' {
611-
iter.ReportError("stringModeNumberDecoder", `expect ", but found ` + string([]byte{c}))
611+
iter.ReportError("stringModeNumberDecoder", `expect ", but found `+string([]byte{c}))
612612
return
613613
}
614614
decoder.elemDecoder.Decode(ptr, iter)
@@ -617,7 +617,7 @@ func (decoder *stringModeNumberDecoder) Decode(ptr unsafe.Pointer, iter *Iterato
617617
}
618618
c = iter.readByte()
619619
if c != '"' {
620-
iter.ReportError("stringModeNumberDecoder", `expect ", but found ` + string([]byte{c}))
620+
iter.ReportError("stringModeNumberDecoder", `expect ", but found `+string([]byte{c}))
621621
return
622622
}
623623
}

jsoniter_invalid_test.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,3 +130,9 @@ func Test_invalid_number(t *testing.T) {
130130
should.Nil(err)
131131
should.Equal(string(result2), string(result))
132132
}
133+
134+
func Test_valid(t *testing.T) {
135+
should := require.New(t)
136+
should.True(Valid([]byte(`{}`)))
137+
should.False(Valid([]byte(`{`)))
138+
}

0 commit comments

Comments
 (0)