zoukankan      html  css  js  c++  java
  • struct,map,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))
    }
    结果展示

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

    func structToJson() {
        user := User{5, "李长全", "1234"}
        result, _ := json.MarshalIndent(user, "", "    ")
        fmt.Println(string(result))
    }

    结果展示

    1.3 struct to json

    func structToJson() {
        user := User{5, "李长全", "1234"}
        result, _ := json.MarshalIndent(user, "", "    ")
    
        u := &User{}
        json.Unmarshal(result, u)
        fmt.Printf("%+v
    ", 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)
    }

     

  • 相关阅读:
    12306-单
    12306-票
    12306-车
    12306-人
    12306-目录
    a+=b 是什么意思?
    开启hadoop和Hbase集群的lzo压缩功能(转)
    HBase性能优化方法总结(转)
    Spark向HDFS中存储数据
    Spark从HDFS上读取JSON数据
  • 原文地址:https://www.cnblogs.com/quanting112037/p/10484022.html
Copyright © 2011-2022 走看看