上篇文章《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
}
首先調(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"} 為例,來看下整個的判斷過程:文章來源:http://www.zghlxwxcb.cn/news/detail-425710.html
- scan.reset()執(zhí)行后將將step賦值為stateBeginValue;
- 首先判斷“{”,使用stateBeginValue方法進行判斷,發(fā)現(xiàn)是,將step賦值為stateBeginStringOrEmpty,執(zhí)行pushParseState往parseState追加表示是key的值0;
- 接下來判斷“"”,使用stateBeginStringOrEmpty方法進行判斷,緊接著使用stateBeginString方法進行判斷,發(fā)現(xiàn)是,將step賦值為stateInString;
- 接下來判斷“a”,使用stateInString方法進行判斷,發(fā)現(xiàn)是,繼續(xù)遍歷;
- 接下來判斷“"”,使用stateInString方法進行判斷,發(fā)現(xiàn)是,將step賦值為stateEndValue;
- 接下來判斷“:”,使用stateEndValue方法進行判斷,看parseState最后一個值,發(fā)現(xiàn)是key部分,檢測到時“:”,將parseState最后一個值置為value部分標識,將step賦值為stateBeginValue;
- 接下來判斷“"”,使用stateBeginValue方法進行判斷,發(fā)現(xiàn)是,將step賦值為stateInString
- 接下來判斷“b”,使用stateInString方法進行判斷,發(fā)現(xiàn)是,繼續(xù)往下遍歷;
- 接下來判斷“"”,使用stateInString方法進行判斷,發(fā)現(xiàn)是,將step賦值為stateEndValue;
- 接下來判斷“}”,使用stateEndValue方法進行判斷,看parseState最后一個值,發(fā)現(xiàn)是value部分,檢測到了“}”,如果parseStat長度為0,step賦值stateEndTop,如果不為0,將step賦值為stateEndValue,檢測結束,返回結果。
小結
大家可以結合源碼和本文來自己體會一下整個的檢測過程。json.Valid方法會把例如123、true、false、null等也認為是json編碼,這可能不是大家在開發(fā)過程中想要的結果,所以下一篇文章會介紹基于json.Valid方法改造后的方法,完美得實現(xiàn)json格式校驗。文章來源地址http://www.zghlxwxcb.cn/news/detail-425710.html
到了這里,關于Golang校驗字符串是否JSON格式方法json.Valid源碼解析的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!