```golang
func TestValidatJson(t *testing.T) {
// 使用gin框架的tag验证也是这样
//validate := validator.New()
//err := validate.Struct(struct {
// Tmp string `json:"tmp" validate:"json"`
//}{
// Tmp: "655452255",
//})
//if err != nil {
// fmt.Println(err)
//}
fmt.Println(json.Valid([]byte("6666666")), json.Valid([]byte("霍山石斛")))
}
```
输出如下:
```golang
=== RUN TestValidatJson
true false
--- PASS: TestValidatJson (0.00s)
PASS
```
github.com/json-iterator/go
用这个
编译gin项目时 :
```
go build -tags=jsoniter .
```
#1
更多评论
调试一下,追追源码,如下所示,那些字符串起始字符都是合法的。中文明显不能是json起始字符,所以错误。
按照源码规则,一串数字字符串是合法的json字符串。
`github.com/json-iterator/go` 这个库也会判断起始位数字字符串是合法的,但是该库认为数字结束至少需要其他字符,例如`}`, <a href="/user/don178" title="@don178">@don178</a> 因此三方库也不靠谱。并且有个 [issues](https://github.com/json-iterator/go/issues/519) 官方貌似一直没处理。
![搜狗截图20230110094447.jpg](https://static.golangjob.cn/230110/6a62466e8d290cfbc66d6c875fe4d661.jpg)
```go
func stateBeginValue(s *scanner, c byte) int {
if isSpace(c) {
return scanSkipSpace
}
// 下面表示验证字符串起始字符,只要符合其中一种就算正常json,按照第一个字符确定下一个字符判断规则,及赋值step
switch c {
case '{':
s.step = stateBeginStringOrEmpty
return s.pushParseState(c, parseObjectKey, scanBeginObject)
case '[':
s.step = stateBeginValueOrEmpty
return s.pushParseState(c, parseArrayValue, scanBeginArray)
case '"':
s.step = stateInString
return scanBeginLiteral
case '-':
s.step = stateNeg
return scanBeginLiteral
case '0': // beginning of 0.123
s.step = state0
return scanBeginLiteral
case 't': // beginning of true
s.step = stateT
return scanBeginLiteral
case 'f': // beginning of false
s.step = stateF
return scanBeginLiteral
case 'n': // beginning of null
s.step = stateN
return scanBeginLiteral
}
if '1' <= c && c <= '9' { // beginning of 1234.5
s.step = state1
return scanBeginLiteral // 最终会走到这里,表示下一个字符扫描数字
}
return s.error(c, "looking for beginning of value")
}
```
#2