成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Golang校驗字符串是否JSON格式方法Json.Valid源碼解析

開發 前端
本篇文章我們來剖析下源碼看下 Encoding/json 包中 Valid 方法的實現原理。

本文來剖析一下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格式校驗。

責任編輯:姜華 來源: 今日頭條
相關推薦

2023-07-31 09:13:13

ValidatorGolang

2010-01-07 16:55:06

JSON字符串

2013-07-23 06:39:49

Json字符串到JsoAndroid開發學習Json萬能解析器

2021-09-30 07:26:15

YamlJsonXml

2009-03-23 14:14:33

JSONAJAXJavaScript

2015-07-02 10:37:32

C#Json字符串類代碼

2024-02-19 15:38:08

JsonPython字符串

2010-01-05 16:48:16

JSON 字符串

2010-01-06 17:06:05

Json格式

2010-01-06 16:33:04

JSON對象標記

2010-02-01 16:46:07

C++格式化字符串

2011-03-04 14:58:40

jqueryJSON

2021-10-31 23:01:50

語言拼接字符串

2009-11-25 09:13:41

PHP數組轉字符串PHP字符串轉數組

2009-11-26 16:26:32

PHP字符串mbstr

2010-07-14 12:39:30

Prel字符串

2010-01-07 15:52:23

JSON字符串

2010-01-06 15:03:34

JSON格式封裝

2011-04-11 13:14:58

AjaxWEB服務

2013-03-27 10:51:44

iOSjson解析網絡交互數據格式解析
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕av第一页 | 成人av电影免费在线观看 | 欧美free性| 精品久久久久久久久亚洲 | 久久中文字幕一区 | 国产黄色在线观看 | 亚洲国产黄色av | 欧美极品视频在线观看 | 久久久久久国产精品 | 国产精品视频在线播放 | 久久婷婷国产麻豆91 | 午夜天堂精品久久久久 | 国产内谢| 天堂va在线观看 | 狠狠干综合视频 | 国产一级毛片精品完整视频版 | 国产探花在线精品一区二区 | 成年人黄色小视频 | 亚洲福利视频网 | 亚洲精品成人在线 | 精品国产欧美日韩不卡在线观看 | 日韩在线免费播放 | 亚洲 自拍 另类 欧美 丝袜 | 免费的av | www亚洲精品 | 亚洲性在线 | 中文字幕亚洲国产 | 国产日产欧产精品精品推荐蛮挑 | 天堂va在线| 综合色播| 日韩在线视频精品 | 亚洲精品一区在线 | 日本在线观看网址 | 亚洲最大的黄色网址 | 欧美精品a∨在线观看不卡 欧美日韩中文字幕在线播放 | 中文字幕在线精品 | 国产日韩一区二区三免费 | 国产视频在线观看一区二区三区 | 日韩欧美在线播放 | 久草视频观看 | 午夜寂寞影院列表 |