当前位置: 代码网 > it编程>前端脚本>Golang > 详解Go语言如何解析带注释的json

详解Go语言如何解析带注释的json

2024年05月15日 Golang 我要评论
一、背景和意义标准的json格式是不带注释,但是有时候为了方便理解json中各字段的含义,需要支持带注释的json。例如在日常工作中常用的接口文档管理平台yapi在配置接口参数与接口返回、或者创建mo

一、背景和意义

标准的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内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com