golang 和 json 字符串互转的问题

pubalabala · · 6790 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

1. 说明

仅做了粗略的测试,不保证严谨性,但足以体现效果。

2. 测试

type T struct {
    Field1 string `json:"tEst1"` // test json tag
    FiEld2 string `bson:"test2"` // test non-json tag
    Field3 string `json:"teSt3"` // test ignore json tag
    Field4 string // test mismatched field
    field5 string // test not export
}

testJson := "{\"test1\": \"test json tag\", \"fIeLd2\": \"test non-json tag and ignore case\", \"Field3\":\"test ignore json tag\", \"Field\":\"test mismatched field\", \"field5\":\"test not export\"}"

bytes := []byte(testJson)
testT := T{}
err := json.Unmarshal(bytes, &testT)
if err != nil {
    fmt.Println("err:", err)
}
// 打印输出,有 json tag 的按照 json tag 比较,无 json tag 的按照字段名比较,比较不区分大小写,为导出字段和未匹配通过的字段忽略
fmt.Printf("%++v\n", testT) // {Field1:test json tag FiEld2:test non-json tag and ignore case Field3: Field4: field5:}

testT = T{
    Field1: "test field use tag",
    FiEld2: "test non-json tag",
    Field3: "test field use tag",
    Field4: "test no tag",
    field5: "test not export",
}
str, err := json.Marshal(testT)
// 输出转换的 json 字符串无未导出字段,无 tag 和非 json tag 字段使用字段名
fmt.Println(string(str)) // {"tEst1":"test field use tag","FiEld2":"test non-json tag","teSt3":"test field use tag","Field4":"test no tag"}

3. 结论

  • 不区分大小写
    golang 结构体(以下简称 struct)字段名称、struct tag(以下简称 tag)、和 json 字符串(以下简称 json)中的字段名之间不区分大小写,互相转换时,会优先检测是否存在 json 的 tag(且仅限于 json 的 tag),如果存在则优先和 tag 比较,未导出字段不参与转换。

    • struct -> json
      生成的字符串会优先使用 tag 作字段名,否则使用 struct 的字段名。
    • json -> struct
      json 字符串会优先按 json 的 tag 进行不区分大小写的匹配,如果匹配失败则忽略该字段;如果没有 json tag,则会按 struct 的字段名进行不区分大小写的匹配。

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:pubalabala

查看原文:golang 和 json 字符串互转的问题

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

6790 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传