一、背景和意义
标准的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内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论