詳解Go語言如何解析帶注釋的json
一、背景和意義
標(biāo)準(zhǔn)的json格式是不帶注釋,但是有時(shí)候?yàn)榱朔奖憷斫鈐son中各字段的含義,需要支持帶注釋的json。例如在日常工作中常用的接口文檔管理平臺(tái)yapi在配置接口參數(shù)與接口返回、或者創(chuàng)建mock數(shù)據(jù)時(shí),就支持配置帶注釋的json。本文給出用go語言解析帶注釋的json的示例。
二、go語言解析普通json
go語言官方自帶的json庫(kù)可以解析普通的json。例如,我們創(chuàng)建一個(gè)main.go文件,代碼如下:
package main
import (
"encoding/json"
"fmt"
)
type user struct {
Name string
Age int
Address struct {
City string
Country string
}
}
func main() {
jsonStr := `{
"name": "ZhangSan",
"age": 11,
"address": {
"city": "Shanghai",
"country": "China"
}
}`
user := &user{}
err := json.Unmarshal([]byte(jsonStr), user)
if err != nil {
fmt.Printf("json解析失?。?+v", err)
} else {
fmt.Printf("json解析結(jié)果:%+v", user)
}
}
運(yùn)行go run main.go命令,運(yùn)行結(jié)果為:
json解析結(jié)果:&{Name:ZhangSan Age:11 Address:{City:Shanghai Country:China}}
但是假如我們?cè)趈son中增加以// ... 或者/* ... */格式的注釋:
package main
import (
"encoding/json"
"fmt"
)
type user struct {
Name string
Age int
Address struct {
City string
Country string
}
}
func main() {
jsonStr := `{
"name": "ZhangSan", // 姓名
"age": 11, // 年齡
/* 地址信息 開始 */
"address": {
"city": "Shanghai",
"country": "China"
}
/* 地址信息 結(jié)束 */
}`
user := &user{}
err := json.Unmarshal([]byte(jsonStr), user)
if err != nil {
fmt.Printf("json解析失敗:%+v", err)
} else {
fmt.Printf("json解析結(jié)果:%+v", user)
}
}
然后執(zhí)行命令go run main.go,可看到運(yùn)行結(jié)果為:
json解析失?。篿nvalid character '/' looking for beginning of object key string
三、go語言解析帶注釋json
使用github.com/titanous/json5庫(kù)可以解析帶注釋的json
package main
import (
"fmt"
"github.com/titanous/json5"
)
type user struct {
Name string
Age int
HomePage string
Address struct {
City string
Country string
}
}
func main() {
jsonStr := `{
"name": "ZhangSan", // 姓名
"age": 11, // 年齡
/* 地址信息 開始 */
"address": {
"city": "Shanghai",
"country": "China"
}
/* 地址信息 結(jié)束 */
}`
user := &user{}
err := json5.Unmarshal([]byte(jsonStr), user)
if err != nil {
fmt.Printf("json解析失敗:%+v", err)
} else {
fmt.Printf("json解析結(jié)果:%+v", user)
}
}
運(yùn)行結(jié)果如下:
json解析結(jié)果:&{Name:ZhangSan Age:11 HomePage: Address:{City:Shanghai Country:China}}
四、其他特殊情況驗(yàn)證
按理來說,按理來說,// ...和/* ... */如果是出現(xiàn)在字符串中,那么他們不應(yīng)該為注釋處理,我們驗(yàn)證一下github.com/titanous/json5是否能夠正確如果這種情況,將main.go文件修改為:
package main
import (
"fmt"
"github.com/titanous/json5"
)
type user struct {
Name string
Age int
HomePage string
Comment string
Address struct {
City string
Country string
}
}
func main() {
jsonStr := `{
"name": "ZhangSan", // 姓名
"age": 11, // 年齡
/* homePage字段的值中有"http://",但它不應(yīng)該被作為注釋處理 */
"homePage": "https://www.testpage.com/index.html",
"comment": "此處測(cè)試一下,/* 這里的注釋是否能夠正確解析 */",
/* 地址信息 開始 */
"address": {
"city": "Shanghai",
"country": "China"
}
/* 地址信息 結(jié)束 */
}`
user := &user{}
err := json5.Unmarshal([]byte(jsonStr), user)
if err != nil {
fmt.Printf("json解析失敗:%+v", err)
} else {
fmt.Printf("json解析結(jié)果:%+v", user)
}
}
運(yùn)行結(jié)果為:
json解析結(jié)果:&{Name:ZhangSan Age:11 HomePage:https://www.testpage.com/index.html Comment:此處測(cè)試一下,/* 這里的注釋是 否能夠正確解析 */ Address:{City:Shanghai Country:China}}
可以看到,github.com/titanous/json5對(duì)于這種特殊情況的處理也是完全正確的。
到此這篇關(guān)于詳解Go語言如何解析帶注釋的json的文章就介紹到這了,更多相關(guān)Go解析帶注釋json內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語言實(shí)現(xiàn)字符串切片賦值的方法小結(jié)
這篇文章主要給大家介紹了Go語言實(shí)現(xiàn)字符串切片賦值的兩種方法,分別是在for循環(huán)的range中以及在函數(shù)的參數(shù)傳遞中實(shí)現(xiàn),有需要的朋友們可以根據(jù)自己的需要選擇使用。下面來一起看看吧。2016-10-10
Windows環(huán)境下vscode-go安裝筆記(不支持32位)
這篇文章主要介紹了Windows環(huán)境下vscode-go安裝筆記(不支持32位),需要的朋友可以參考下2017-02-02
使用Golang實(shí)現(xiàn)加權(quán)負(fù)載均衡算法的實(shí)現(xiàn)代碼
這篇文章主要介紹了使用Golang實(shí)現(xiàn)加權(quán)負(fù)載均衡算法的實(shí)現(xiàn)代碼,詳細(xì)說明權(quán)重轉(zhuǎn)發(fā)算法的實(shí)現(xiàn),通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09
Golang實(shí)現(xiàn)HTTP代理突破IP訪問限制的步驟詳解
在當(dāng)今互聯(lián)網(wǎng)時(shí)代,網(wǎng)站和服務(wù)商為了維護(hù)安全性和保護(hù)用戶隱私,常常會(huì)對(duì)特定的IP地址進(jìn)行封鎖或限制,本文將介紹如何使用Golang實(shí)現(xiàn)HTTP代理來突破IP訪問限制,需要的朋友可以參考下2023-10-10
關(guān)于升級(jí)go1.18的goland問題詳解
作為一個(gè)go語言程序員,覺得自己有義務(wù)為go新手開一條更簡(jiǎn)單便捷的上手之路,下面這篇文章主要給大家介紹了關(guān)于升級(jí)go1.18的goland問題的相關(guān)資料,需要的朋友可以參考下2022-11-11
解決Golang中g(shù)oroutine執(zhí)行速度的問題
這篇文章主要介紹了解決Golang中g(shù)oroutine執(zhí)行速度的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-05-05

