欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

struct,map,json 互相转换

程序员文章站 2023-08-02 21:35:12
1.1 struct to json 准备 很简单,使用encoding包可以互相转换,没什么好说的,但是有几点注意: 1.结构体内需要序列化的字段首字母大写(遵循驼峰式命名),不需要序列化的字段小写无所谓了 2.如果需要序列化后的json key格式小写,需要加上json标签 3.json标签内, ......

1.1 struct to json 准备

  很简单,使用encoding包可以互相转换,没什么好说的,但是有几点注意:

1.结构体内需要序列化的字段首字母大写(遵循驼峰式命名),不需要序列化的字段小写无所谓了

username string `json:"username"` 将会使用username做json key值

2.如果需要序列化后的json key格式小写,需要加上json标签 

`json:"password"`

3.json标签内,首字符如果是逗号,将使用字段输出,json标签内的指定key将自动忽略

 `json:",password"`  加上逗号

4.如果需要忽略json输出,可以在json标签内,使用 '-',横线作忽略标记

 `json:"-"` 作忽略

1.2结构体转json

func structtojson() {
    user := user{5, "李长全", "1234"}
    result, _ := json.marshal(user)
    fmt.println(string(result))
}
结果展示

struct,map,json 互相转换

这种方式输出的json,是一行展示,一般测试的时候,我会这样输出,方便做字符串比较,但是如果调试的时候,我习惯换一种方式,输出的是json格式化之后的字符串,这样就不用json工具做转换了

func structtojson() {
    user := user{5, "李长全", "1234"}
    result, _ := json.marshalindent(user, "", "    ")
    fmt.println(string(result))
}

结果展示

struct,map,json 互相转换

1.3 struct to json

func structtojson() {
    user := user{5, "李长全", "1234"}
    result, _ := json.marshalindent(user, "", "    ")

    u := &user{}
    json.unmarshal(result, u)
    fmt.printf("%+v\n", u)
}

2.1struct转map

 

func struct2map(obj interface{}) map[string]interface{} {
    t := reflect.typeof(obj)  //使用反射,k根据typeof拿到field
    v := reflect.valueof(obj) //v根据valueof拿到interface

    var data = make(map[string]interface{})
    for i := 0; i < t.numfield(); i++ {
        data[t.field(i).name] = v.field(i).interface()
    }
    return data
}

 通过反射,拿到属性和值,属性做key,值做value,存储到map中,使用typeof和valueof,但是我当然是不喜欢了,我喜欢下面这种方式,使用valueof就可以解决的问题,为啥非要多一步typeof

关于typeof和valueof,等我写反射的时候,再详细说

2.2反射第二种方式

func structtomap() {
    a := user{1, "李长全", "1234"}
    elem := reflect.valueof(&a).elem()
    types := elem.type()
    m := map[string]interface{}{}
    for i := 0; i < types.numfield(); i++ {
        m[types.field(i).name] = elem.field(i).interface()
    }
}

当然了,方法还有,结构转json,都会了,map转json也是一样的,那很简单了,通过json做中间转换一下啊, (a=b知道了,  b=c知道了  如何求ac,通过b转换啊)

2.3通过json转换

func structtoendmap() {
    t := time.now()
    m := make(map[string]interface{})
    user := user{5, "李长全", "1234"}
    j, _ := json.marshal(user)
    json.unmarshal(j, &m)
    fmt.println(m)
    fmt.printf("duration:%d", time.now().sub(t))
}

3.map转结构


  map转结构,我看到一种写法使用第三方包,这个包叫mapstruct,只有decode方法,找半天,没找到encode,这么low么,我是不信的,只能map转成结构,结构无法回转吗,我是拒绝的

func maptostruct() {
    mapinstance := make(map[string]interface{})
    mapinstance["name"] = "lcq"
    mapinstance["age"] = 28

    var person user
    if err := mapstructure.decode(mapinstance, &person); err != nil {
        fmt.println(err)
    }
    fmt.printf("struct:%v", person)
}