Golang校验字符串是否JSON格式的方法总结(golang testing)速看

随心笔谈1年前发布 编辑
161 0



目录json.Validjson.Valid方法源码使用一个示例来看检测过程json-validator-go开发json-validator-go工具原因json-validator-go使用方法

json.Valid方法定义:

// Valid reports whether data is a valid JSON encoding.
func Valid(data []byte) bool {
scan :=newScanner()
defer freeScanner(scan)
return checkValid(data, scan)==nil
}

scan :=newScanner() 获取一个 scanner 类型的对象,关键的是checkValid方法,checkValid源码如下:

// checkValid verifies that data is valid JSON-encoded data.
// scan is passed in for use by checkValid to avoid an allocation.
func checkValid(data []byte, scan *scanner) error {
scan.reset()
for _, c :=range data {
scan.bytes++
if scan.step(scan, c)==scanError {
return scan.err
}
}
if scan.eof()==scanError {
return scan.err
}
return nil
}

首先调用了scan.reset(),主要是初始化scanner关键字段,如下:

s.step=stateBeginValue
s.parseState=s.parseState[0:0]
s.err=nil
s.endTop=false

然后就是通过遍历要校验的数据,使用状态机方式做判断。

接下来以 {“a”:”b”} 为例,来看下整个的判断过程:

scan.reset()执行后将将step赋值为stateBeginValue;首先判断“{”,使用stateBeginValue方法进行判断,发现是,将step赋值为stateBeginStringOrEmpty,执行pushParseState往parseState追加表示是key的值0;接下来判断“””,使用stateBeginStringOrEmpty方法进行判断,紧接着使用stateBeginString方法进行判断,发现是,将step赋值为stateInString;接下来判断“a”,使用stateInString方法进行判断,发现是,继续遍历;接下来判断“””,使用stateInString方法进行判断,发现是,将step赋值为stateEndValue;接下来判断“:”,使用stateEndValue方法进行判断,看parseState最后一个值,发现是key部分,检测到时“:”,将parseState最后一个值置为value部分标识,将step赋值为stateBeginValue;接下来判断“””,使用stateBeginValue方法进行判断,发现是,将step赋值为stateInString接下来判断“b”,使用stateInString方法进行判断,发现是,继续往下遍历;接下来判断“””,使用stateInString方法进行判断,发现是,将step赋值为stateEndValue;接下来判断“}”,使用stateEndValue方法进行判断,看parseState最后一个值,发现是value部分,检测到了“}”,如果parseStat长度为0,step赋值stateEndTop,如果不为0,将step赋值为stateEndValue,检测结束,返回结果。

json.Valid方法会把例如123、true、false、null,[“a”,”b”]等也认为是json编码,这可能不是大家在开发过程中想要的结果。

平常开发中,json格式应该要求是例如{}、[]、{“key”,”val”}、[{“key1″,”val1”}、{“key2″,”val2”}]格式的,为了实现严格的json格式校验,基于json.Valid开发了json-validator-go工具。

使用方法很简单,和json.Valid的使用方法类似,示例代码如下:

package main

import (
“fmt”
“github.com/luduoxin/json-validator-go/validator”
)

func main() {
dataStr :=`

可以仔细阅读如下测试用例并运行一下看看效果:

package main

import (
“fmt”
“github.com/luduoxin/json-validator-go/validator”
)

func main() {
var validTests=[]struct {
data string
ok bool
}{
{`foo`, false},
{`}{`, false},
{`{]`, false},
{`123`, false},
{`123.5`, false},
{`0.5`, false},
{`true`, false},
{`false`, false},
{`null`, false},
{`[1,2,3]`, false},
{`[“a”,”b”,”c”]`, false},
{`

运行后没有输出,说明所有用例都是通过的。可以自己写些用例,如有的用例没有通过,欢迎提出来。

到此这篇关于Golang校验字符串是否JSON格式的方法总结的文章就介绍到这了,更多相关Golang校验字符串是否JSON格式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:Go如何实现json字符串与各类struct相互转换Go语言利用Unmarshal解析json字符串的实现golang中json小谈之字符串转浮点数的操作解决Golang json序列化字符串时多了\的情况Go 结构体、数组、字典和 json 字符串的相互转换方法Golang实现验证一个字符串是否为URLGo 验证字符串中是否包含中文(推荐)

© 版权声明

相关文章