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)
    }

     

  • 相关阅读:
    HDU 1075 What Are You Talking About(字典树)
    HDU 1075 What Are You Talking About (stl之map映射)
    HDU 1247 Hat’s Words(字典树活用)
    字典树HihoCoder
    HDU 1277全文检索(字典树)
    HDU 3294 Girls' research(manachar模板题)
    HDU 3294 Girls' research(manachar模板题)
    HDU 4763 Theme Section(KMP灵活应用)
    Ordering Tasks UVA
    Abbott's Revenge UVA
  • 原文地址:https://www.cnblogs.com/quanting112037/p/10484022.html
Copyright © 2011-2022 走看看