Go_14:GoLang中 jsonmapstruct 之间的相互转化

Posted 星火燎原智勇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go_14:GoLang中 jsonmapstruct 之间的相互转化相关的知识,希望对你有一定的参考价值。

1. golang 中 json 转 struct

  <1. 使用 json.Unmarshal 时,结构体的每一项必须是导出项(import field)。也就是说结构体的 key 对应的首字母必须为大写。请看下面的例子:

package commontest

import (
    "testing"
    "encoding/json"
)

type Person struct {
    name string
    age int
}

func TestStruct2Json(t *testing.T) {
    jsonStr := `
    {
        "name":"liangyongxing",
        "age":12
    }
    `
    var person Person
    json.Unmarshal([]byte(jsonStr), &person)
    t.Log(person)
}

输出的结果如下:

{ 0}

   从结果可以看出,json 数据并没有写入 Person 结构体中。结构体 key 首字母大写的话就可以,修改后:

package commontest

import (
    "testing"
    "encoding/json"
)

type Person struct {
    Name string
    Age int
}

func TestStruct2Json(t *testing.T) {
    jsonStr := `
    {
        "name":"liangyongxing",
        "age":12
    }
    `
    var person Person
    json.Unmarshal([]byte(jsonStr), &person)
    t.Log(person)
}

打印结果如下:

{liangyongxing 12}

   从以上结果我们可以发现一个很重要的信息,json 里面的 key 和 struct 里面的 key 一个是小写一个是大写,即两者大小写并没有对上。从这里我们就可以得出一个结论,要想能够附上值需要结构体中的变量名首字母大写,而在转换的 json 串中大小写都可以,即在 json 传中字段名称大小写不敏感。那么经过验证发现,在 json 中如果写成如下方式:

jsonStr := `
    {
        "NaMe":"liangyongxing",
        "agE":12
    }
    `

  最终结果仍然是有值的,那么就验证了我们上面的结论,json 串中对字段名大小写不敏感(不一定是首字母,这点需要注意)

  <2. 在结构体中是可以引入 tag 标签的,这样在匹配的时候 json 串对应的字段名需要与 tag 标签中定义的字段名匹配,当然在 tag 中定义的名称就不需要首字母大写了,且对应的 json 串中字段名称仍然大小写不敏感,和上面的结论一致。(注意:此时结构体中对应的字段名可以不用和匹配的一致,但是也必须首字母大写,只有大写的才是可对外提供访问的)

package commontest

import (
    "testing"
    "encoding/json"
)

//这里对应的 N 和 A 不能为小写,首字母必须为大写,这样才可对外提供访问,具体 json 匹配是通过后面的 tag 标签进行匹配的,与 N 和 A 没有关系
//tag 标签中 json 后面跟着的是字段名称,都是字符串类型,要求必须加上双引号,否则 golang 是无法识别它的类型
type Person struct {
    N string     `json:"name"`
    A int        `json:"age"`
}

func TestStruct2Json(t *testing.T) {
    jsonStr := `
    {
        "name":"liangyongxing",
        "age":12
    }
    `
    var person Person
    json.Unmarshal([]byte(jsonStr), &person)
    t.Log(person)
}

这样输出的结果如下:

{liangyongxing 12}

   当然,你也可以再做一个实验,验证 tag 标签中对应的字段名称大小写不敏感,这里就不做冗余介绍了。

2. golang 中 struct 转 json 串

  持续总结中

 

以上是关于Go_14:GoLang中 jsonmapstruct 之间的相互转化的主要内容,如果未能解决你的问题,请参考以下文章

Go_16:GoLang中flag标签使用

GO_05_2:Golang 中 panicrecoverdefer 的用法

Go_20: Golang 中 time 包的使用

Go_19: Golang 中错误与异常需要重新认识

Go_15:GoLang中面向对象的三大特性

Golang中的init函数