国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

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
}

首先調(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,檢測結束,返回結果。

小結

大家可以結合源碼和本文來自己體會一下整個的檢測過程。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)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

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

    可以使用 Java 8 的 DateTimeFormatter 類來判斷日期字符串是否符合指定格式。具體代碼如下: 如果你不想通過捕獲異常的方式來判斷日期字符串是否符合指定格式,也可以使用 DateTimeFormatter 類中的 parseUnresolved() 方法來進行解析。具體代碼如下: 以上代碼中,使用 parseUnresolved(

    2024年02月16日
    瀏覽(29)
  • hivesql 將json格式字符串轉為數(shù)組

    hivesql 將json格式字符串轉為數(shù)組

    完整過程SQL在文末 本案例 json 字符串參考格式,請勿使用本數(shù)據(jù) 本案例測試數(shù)據(jù),復制保存后請勿格式化 本案例為數(shù)倉分層設計 創(chuàng)建ods層原始數(shù)據(jù)表 創(chuàng)建dwd層維度數(shù)據(jù)表 ETL轉換ods層數(shù)據(jù)插入到dwd層 創(chuàng)建ods層原始數(shù)據(jù)表 加載測試數(shù)據(jù) 創(chuàng)建dwd層維度數(shù)據(jù)表 ETL轉換ods層數(shù)據(jù)插

    2024年02月03日
    瀏覽(23)
  • Json-序列化字符串時間格式問題

    最近C#中需要將實體進行json序列化,使用了Newtonsoft.Json 序列化出來的Json字符串有兩個問題 1.沒有進行格式化,對使用人員不友好; 2.時間字段形式為數(shù)字形式; ?? 查了一下網(wǎng)上對于時間字段建議先轉換成字符串,再json序列化,但是發(fā)現(xiàn)可以通過自定義時間格式進行json序

    2024年02月19日
    瀏覽(23)
  • Java工具類——json字符串格式化處理

    Java工具類——json字符串格式化處理

    在我們拿到一團未經(jīng)格式化的json字符串時,非常不方便查看,比如這樣 因此隨手寫了個工具類用來格式化json。注意,原json字符串必須語法無誤,并且不包含換行、空格、縮進等,否則會保留下來。 ok廢話不多說上代碼 運行后效果

    2024年01月17日
    瀏覽(29)
  • linux下json字符串格式化、解決json.tool中文亂碼

    環(huán)境: centos7.9 在有外網(wǎng)的情況下,如果對數(shù)據(jù)沒有嚴格的保密,那么可以通過在線json解析網(wǎng)站 https://www.sojson.com/ 對json字符串進行格式化。本篇講如何在Linux環(huán)境下使用命令對json字符串進行格式化。 修改json.tool程序,該程序存在于python系統(tǒng)庫安裝路徑下的json/tool.py, json.

    2024年02月15日
    瀏覽(24)
  • 使用正則表達式判斷日期字符串格式是否合法遇到的問題(解決)

    使用正則表達式判斷日期字符串格式是否合法遇到的問題(解決)

    我們在使用SpringMVC從前端接受傳遞過來的日期數(shù)據(jù)時,默認傳遞過來的數(shù)據(jù)是String類型,如果我們從前端傳遞過來的數(shù)據(jù)格式是yyyy/MM/dd,SpringMVC有內(nèi)置類型轉化器會將String類型自動轉化成Date類型。但如果我們從前端傳遞過來的數(shù)據(jù)格式是yyyy-MM-dd,SpringMVC的內(nèi)置轉化器就不能

    2024年02月08日
    瀏覽(27)
  • JS 將 json 對象轉成字符串并保留格式 - JSON.stringify()

    JS 將 json 對象轉成字符串并保留格式 - JSON.stringify()

    JSON.stringify(value, replacer, space) value :將要序列化成一個 JSON 字符串的值。 replacer(可選) :如果該參數(shù)是一個函數(shù),則在序列化過程中,被序列化的值的每個屬性都會經(jīng)過該函數(shù)的轉換和處理;如果該參數(shù)是一個數(shù)組,則只有包含在這個數(shù)組中的屬性名才會被序列化到最終的

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

    這個問題的答案是社區(qū)的努力。編輯現(xiàn)有答案以改進這篇文章。它目前不接受新的答案或交互。 我正在尋找 Python 中的 string.contains 或 string.indexof 方法。 我想要做: 一個優(yōu)秀的自由職業(yè)者,應該有對需求敏感和精準需求捕獲的能力,而huntsbot.com提供了這個機會 使用 in opera

    2024年02月12日
    瀏覽(37)
  • Java 列表json格式的字符串轉列表對象 并遍歷取值

    導入依賴與包 最后輸出的數(shù)據(jù); 以上即為本人項目中的處理思路,若有幫助到你,那真的太好了! 若沒有望親噴

    2024年02月15日
    瀏覽(27)
  • Java中的List<T>對象與Json格式的字符串的相互轉換

    在這里我隨便舉一個例子 OK,以上就是互相轉換的過程 我使用的場景是在訂單的訂單列表項這里,涉及到數(shù)據(jù)庫相應字段數(shù)據(jù)的存放與提取,我的做法是,將List轉換為Json格式字符串存入,取時再將Json格式轉為List

    2024年02月15日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包