大佬们,为什么go的json.valid()方法可以通过数字型字符串啊(是否有其他验证是否是json字符串的方式)

hengbo · · 1458 次点击
更多评论
github.com/json-iterator/go 用这个 编译gin项目时 : ``` go build -tags=jsoniter . ```
#1
jan-bar
想要拥有,必定付出。
调试一下,追追源码,如下所示,那些字符串起始字符都是合法的。中文明显不能是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 &#39;{&#39;: s.step = stateBeginStringOrEmpty return s.pushParseState(c, parseObjectKey, scanBeginObject) case &#39;[&#39;: s.step = stateBeginValueOrEmpty return s.pushParseState(c, parseArrayValue, scanBeginArray) case &#39;&#34;&#39;: s.step = stateInString return scanBeginLiteral case &#39;-&#39;: s.step = stateNeg return scanBeginLiteral case &#39;0&#39;: // beginning of 0.123 s.step = state0 return scanBeginLiteral case &#39;t&#39;: // beginning of true s.step = stateT return scanBeginLiteral case &#39;f&#39;: // beginning of false s.step = stateF return scanBeginLiteral case &#39;n&#39;: // beginning of null s.step = stateN return scanBeginLiteral } if &#39;1&#39; &lt;= c &amp;&amp; c &lt;= &#39;9&#39; { // beginning of 1234.5 s.step = state1 return scanBeginLiteral // 最终会走到这里,表示下一个字符扫描数字 } return s.error(c, &#34;looking for beginning of value&#34;) } ```
#2