日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Golang校驗字符串是否JSON格式方法Json.Valid源碼解析

本文來剖析一下json.Valid方法的源碼。

柳北網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)公司!從網(wǎng)頁設計、網(wǎng)站建設、微信開發(fā)、APP開發(fā)、響應式網(wǎng)站設計等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)公司于2013年成立到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設就選創(chuàng)新互聯(lián)公司。

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
}

首先調(diào)用了scan.reset(),主要是初始化scanner關鍵字段,如下:

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

然后就是通過遍歷要校驗的數(shù)據(jù),使用狀態(tài)機方式做判斷。

使用一個示例來看檢測過程

接下來以 {"a":"b"} 為例,來看下整個的判斷過程:

  1. scan.reset()執(zhí)行后將將step賦值為stateBeginValue;
  2. 首先判斷“{”,使用stateBeginValue方法進行判斷,發(fā)現(xiàn)是,將step賦值為stateBeginStringOrEmpty,執(zhí)行pushParseState往parseState追加表示是key的值0;
  3. 接下來判斷“"”,使用stateBeginStringOrEmpty方法進行判斷,緊接著使用stateBeginString方法進行判斷,發(fā)現(xiàn)是,將step賦值為stateInString;
  4. 接下來判斷“a”,使用stateInString方法進行判斷,發(fā)現(xiàn)是,繼續(xù)遍歷;
  5. 接下來判斷“"”,使用stateInString方法進行判斷,發(fā)現(xiàn)是,將step賦值為stateEndValue;
  6. 接下來判斷“:”,使用stateEndValue方法進行判斷,看parseState最后一個值,發(fā)現(xiàn)是key部分,檢測到時“:”,將parseState最后一個值置為value部分標識,將step賦值為stateBeginValue;
  7. 接下來判斷“"”,使用stateBeginValue方法進行判斷,發(fā)現(xiàn)是,將step賦值為stateInString
  8. 接下來判斷“b”,使用stateInString方法進行判斷,發(fā)現(xiàn)是,繼續(xù)往下遍歷;
  9. 接下來判斷“"”,使用stateInString方法進行判斷,發(fā)現(xiàn)是,將step賦值為stateEndValue;
  10. 接下來判斷“}”,使用stateEndValue方法進行判斷,看parseState最后一個值,發(fā)現(xiàn)是value部分,檢測到了“}”,如果parseStat長度為0,step賦值stateEndTop,如果不為0,將step賦值為stateEndValue,檢測結(jié)束,返回結(jié)果。

小結(jié)

大家可以結(jié)合源碼和本文來自己體會一下整個的檢測過程。json.Valid方法會把例如123、true、false、null等也認為是json編碼,這可能不是大家在開發(fā)過程中想要的結(jié)果,所以下一篇文章會介紹基于json.Valid方法改造后的方法,完美得實現(xiàn)json格式校驗。


網(wǎng)頁題目:Golang校驗字符串是否JSON格式方法Json.Valid源碼解析
當前URL:http://www.dlmjj.cn/article/dhidhss.html