Golang校验字符串是否JSON格式方法json.Valid源码解析

这篇具有很好参考价值的文章主要介绍了Golang校验字符串是否JSON格式方法json.Valid源码解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

上篇文章《Golang中如何校验字符串是否为JSON格式?》主要讲解了使用json.Valid校验字符串是否JSON格式的使用方法,本文来剖析一下json.Valid方法的源码。

json.Valid方法源码

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"} 为例,来看下整个的判断过程:

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

小结

大家可以结合源码和本文来自己体会一下整个的检测过程。json.Valid方法会把例如123、true、false、null等也认为是json编码,这可能不是大家在开发过程中想要的结果,所以下一篇文章会介绍基于json.Valid方法改造后的方法,完美得实现json格式校验。文章来源地址https://www.toymoban.com/news/detail-425710.html

到了这里,关于Golang校验字符串是否JSON格式方法json.Valid源码解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java 8 判断日期字符串是否符合指定格式

    可以使用 Java 8 的 DateTimeFormatter 类来判断日期字符串是否符合指定格式。具体代码如下: 如果你不想通过捕获异常的方式来判断日期字符串是否符合指定格式,也可以使用 DateTimeFormatter 类中的 parseUnresolved() 方法来进行解析。具体代码如下: 以上代码中,使用 parseUnresolved(

    2024年02月16日
    浏览(60)
  • hivesql 将json格式字符串转为数组

    完整过程SQL在文末 本案例 json 字符串参考格式,请勿使用本数据 本案例测试数据,复制保存后请勿格式化 本案例为数仓分层设计 创建ods层原始数据表 创建dwd层维度数据表 ETL转换ods层数据插入到dwd层 创建ods层原始数据表 加载测试数据 创建dwd层维度数据表 ETL转换ods层数据插

    2024年02月03日
    浏览(50)
  • Json-序列化字符串时间格式问题

    最近C#中需要将实体进行json序列化,使用了Newtonsoft.Json 序列化出来的Json字符串有两个问题 1.没有进行格式化,对使用人员不友好; 2.时间字段形式为数字形式; ​​ 查了一下网上对于时间字段建议先转换成字符串,再json序列化,但是发现可以通过自定义时间格式进行json序

    2024年02月19日
    浏览(42)
  • Java工具类——json字符串格式化处理

    在我们拿到一团未经格式化的json字符串时,非常不方便查看,比如这样 因此随手写了个工具类用来格式化json。注意,原json字符串必须语法无误,并且不包含换行、空格、缩进等,否则会保留下来。 ok废话不多说上代码 运行后效果

    2024年01月17日
    浏览(54)
  • linux下json字符串格式化、解决json.tool中文乱码

    环境: centos7.9 在有外网的情况下,如果对数据没有严格的保密,那么可以通过在线json解析网站 https://www.sojson.com/ 对json字符串进行格式化。本篇讲如何在Linux环境下使用命令对json字符串进行格式化。 修改json.tool程序,该程序存在于python系统库安装路径下的json/tool.py, json.

    2024年02月15日
    浏览(55)
  • 使用正则表达式判断日期字符串格式是否合法遇到的问题(解决)

    我们在使用SpringMVC从前端接受传递过来的日期数据时,默认传递过来的数据是String类型,如果我们从前端传递过来的数据格式是yyyy/MM/dd,SpringMVC有内置类型转化器会将String类型自动转化成Date类型。但如果我们从前端传递过来的数据格式是yyyy-MM-dd,SpringMVC的内置转化器就不能

    2024年02月08日
    浏览(53)
  • JS 将 json 对象转成字符串并保留格式 - JSON.stringify()

    JSON.stringify(value, replacer, space) value :将要序列化成一个 JSON 字符串的值。 replacer(可选) :如果该参数是一个函数,则在序列化过程中,被序列化的值的每个属性都会经过该函数的转换和处理;如果该参数是一个数组,则只有包含在这个数组中的属性名才会被序列化到最终的

    2024年02月13日
    浏览(49)
  • Python 是否有字符串“包含”子字符串方法?

    这个问题的答案是社区的努力。编辑现有答案以改进这篇文章。它目前不接受新的答案或交互。 我正在寻找 Python 中的 string.contains 或 string.indexof 方法。 我想要做: 一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会 使用 in opera

    2024年02月12日
    浏览(90)
  • Java 列表json格式的字符串转列表对象 并遍历取值

    导入依赖与包 最后输出的数据; 以上即为本人项目中的处理思路,若有帮助到你,那真的太好了! 若没有望亲喷

    2024年02月15日
    浏览(52)
  • Java中的List<T>对象与Json格式的字符串的相互转换

    在这里我随便举一个例子 OK,以上就是互相转换的过程 我使用的场景是在订单的订单列表项这里,涉及到数据库相应字段数据的存放与提取,我的做法是,将List转换为Json格式字符串存入,取时再将Json格式转为List

    2024年02月15日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包