目录
- 一、背景和意义
- 二、go语言解析普通json
- 三、go语言解析带注释json
- 四、其他特殊情况验证
一、背景和意义
标准的json格式是不带注释,但是有时候为了方便理解json中各字段的含义,需要支持带注释的json。例如在日常工作中常用的接口文档管理平台yapi在配置接口参数与接口返回、或者创建mock数据时,就支持配置带注释的json。本文给出用go语言解析带注释的json的示例。
二、go语言解析普通json
go语言官方自带的json库可以解析普通的json。例如,我们创建一个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解析结果:%+v\”, user)
}
}
运行go run main.go命令,运行结果为:
json解析结果:&{Name:ZhangSan Age:11 Address:{City:Shanghai Country:China}}
但是假如我们在json中增加以// … 或者/* … */格式的注释:
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解析结果:%+v\”, user)
}
}
然后执行命令go run main.go,可看到运行结果为:
json解析失败:invalid character '/' looking for beginning of object key string
三、go语言解析带注释json
使用github.com/titanous/json5库可以解析带注释的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\”
}
/* 地址信息 结束 */
}`
user := &user{}
err := json5.Unmarshal([]byte(jsonStr), user)
if err != nil {
fmt.Printf(\”json解析失败:%+v\”, err)
} else {
fmt.Printf(\”json解析结果:%+v\”, user)
}
}
运行结果如下:
json解析结果:&{Name:ZhangSan Age:11 HomePage: Address:{City:Shanghai Country:China}}
四、其他特殊情况验证
按理来说,按理来说,// …和/* … */如果是出现在字符串中,那么他们不应该为注释处理,我们验证一下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字段的值中有\”//\”,但它不应该被作为注释处理 */
\”homePage\”: \”https://www.testpage.com/index.html\”,
\”comment\”: \”此处测试一下,/* 这里的注释是否能够正确解析 */\”,
/* 地址信息 开始 */
\”address\”: {
\”city\”: \”Shanghai\”,
\”country\”: \”China\”
}
/* 地址信息 结束 */
}`
user := &user{}
err := json5.Unmarshal([]byte(jsonStr), user)
if err != nil {
fmt.Printf(\”json解析失败:%+v\”, err)
} else {
fmt.Printf(\”json解析结果:%+v\”, user)
}
}
运行结果为:
json解析结果:&{Name:ZhangSan Age:11 HomePage:https://www.testpage.com/index.html Comment:此处测试一下,/* 这里的注释是 否能够正确解析 */ Address:{City:Shanghai Country:China}}
可以看到,github.com/titanous/json5对于这种特殊情况的处理也是完全正确的。
到此这篇关于详解Go语言如何解析带注释的json的文章就介绍到这了,更多相关Go解析带注释json内容请搜索悠久资源网以前的文章或继续浏览下面的相关文章希望大家以后多多支持悠久资源网!
您可能感兴趣的文章:
- Go解析不定JSON数据的方法详解
- GO中Json解析的几种方式
- 深入解析Golang中JSON的编码与解码
- Golang实现解析JSON的三种方法总结
- golang生成JSON以及解析JSON