Hits

Golang中json、map、struct互相转换

Golang–每天进步一点点

Golang中json、map、struct之间互相转换

json转struct

使用json.Unmarshal时,结构体的每一项必须是导出项(import field)。也就是说结构体的key对应的首字母必须大写。

package main

import (
    "encoding/json"
    "fmt"
)

type People struct {
    Name string   `json:"name_tile"`
    Age  int         `json:"age_size"`
}

func JsonToStructDemo() {
    jsonStr := `
    {
        "name_tile": "liuXX",
        "age_size": 12
    }
    `
    var people People
    json.Unmarshal([]byte(jsonStr), &people)
    fmt.Println(people)
}

func main() {
    JsonToStructDemo()
}

json转换struct最重要的信息,json里面的key和struct里面的key要一直,struct中key的首字母必须大写,而json中大小写都可以。

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

struct转json串

package test

import (
    "testing"
    "encoding/json"
)

type People struct {
    Name string   `json:"name_tILE"`
    Age  int         `json:"AGE_SIZE"`
}


func TestStructToJson(t *testing.T) {
    p := People{
        Name: "Liu xx",
        Age: 18,
    }

    t.Logf("Person 结构体打印结果:%v", p)

    //Person 结构体转换为对应的 Json
    jsonBytes, err := json.Marshal(p)
    if err != nil {
        t.Fatal(err)
    }
    t.Logf("转换为 json 串打印结果:%s", string(jsonBytes))
}

json转map

func TestJsonToMap(t *testing.T) {
    jsonStr := `
    {
        "name": "Liu XX",
        "age": 18
    }
    `
    var mapResult map[string]interface{}
    //使用 json.Unmarshal(data []byte, v interface{})进行转换,返回 error 信息
    if err := json.Unmarshal([]byte(jsonStr), &mapResult); err != nil {
        t.Fatal(err)
    }
    t.Log(mapResult)
}

map转json

func TestMapToJson(t *testing.T) {
    mapInstance := make(map[string]interface{})
    mapInstance["Name"] = "Liu xx"
    mapInstance["Age"] = 18
    mapInstance["Address"] = "广东 深圳"

    jsonStr, err := json.Marshal(mapInstance)

    if err != nil {
        t.Fatal(err)
    }

    t.Logf("TestMapToJson 得到 json 字符串内容:%s", jsonStr)
}

map转struct

map转换struct要用第三方库提供的方法

$ go get github.com/goinggo/mapstructure
func TestMapToStruct(t *testing.T) {
    mapInstance := make(map[string]interface{})
    mapInstance["Name"] = "liang637210"
    mapInstance["Age"] = 28

    var people People
    //将 map 转换为指定的结构体
    if err := mapstructure.Decode(mapInstance, &people); err != nil {
        t.Fatal(err)
    }
    t.Logf("map2struct后得到的 struct 内容为:%v", people)
}

struct转map

type User struct {
    Id        int    `json:"id"`
    Username    string    `json:"username"`
    Password    string    `json:"password"`
}

func StructToMap(obj interface{}) map[string]interface{} {
    t := reflect.TypeOf(obj)
    v := reflect.ValueOf(obj)

    var data = make(map[string]interface{})
    for i := 0; i < t.NumField(); i++ {
        data[t.Field(i).Name] = v.Field(i).Interface()
    }
    return data
}

func TestStructToMap(t *testing.T) {
    user := User{5, "zhangsan", "password"}
    data := StructToMap(user)
    t.Logf("struct2map得到的map内容为:%v", data)
}

本文链接:参与评论 »

--EOF--

提醒:本文最后更新于 359 天前,文中所描述的信息可能已发生改变,请谨慎使用。

专题「跟我一起学Go」的其它文章 »

Comments