前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GO系列(5)-struct的json

GO系列(5)-struct的json

原创
作者头像
爽朗地狮子
修改2022-10-20 11:38:07
3010
修改2022-10-20 11:38:07
举报
文章被收录于专栏:云原生系列

一. struct转json

表示我要把相关的字段编码进结构体中

Struct tag “-” 表示跳过指定的 filed:

例1

代码语言:txt
复制
package main

import (
   "encoding/json"
   "fmt"
)

// Message TODO
type Message struct {
   Name string `json:"some_field"`
   Body string `json:"-"`
   Time int64
}

func main() {
   m := Message{"Alice", "Hello", 234234234}
   b, err := json.Marshal(m)
   if err != nil {
      fmt.Println("生成json字符串错误")
   }
   var a string = string(b)
   fmt.Printf("%s", a)
}

输出

代码语言:txt
复制
{"some_field":"Alice","Time":234234234}

例2

代码语言:txt
复制
package main

import (
   "encoding/json"
   "fmt"
)

// Stu TODO
type Stu struct {
   Name  string `json:"name"`
   Age   int
   HIgh  bool
   sex   string
   Class *Class `json:"class"`
}

// Class TODO
type Class struct {
   Name  string
   Grade int
}

func main() {
   // 实例化一个数据结构,用于生成json字符串
   stu := Stu{
      Name: "张三",
      Age:  18,
      HIgh: true,
      sex:  "男",
   }

   // 指针变量
   cla := new(Class)
   cla.Name = "1班"
   cla.Grade = 3
   stu.Class = cla

   // Marshal失败时err!=nil
   jsonStu, err := json.Marshal(stu)
   if err != nil {
      fmt.Println("生成json字符串错误")
   }

   // jsonStu是[]byte类型,转化成string类型便于查看
   fmt.Println(string(jsonStu))
}

输出结果:

代码语言:txt
复制
{"name":"张三","Age":18,"HIgh":true,"class":{"Name":"1班","Grade":3}}

二. json转struct

代码语言:txt
复制
package main

import (
   "encoding/json"
   "fmt"
)

// StuRead TODO
type StuRead struct {
   Name  interface{} `json:"name"`
   Age   interface{}
   HIgh  interface{}
   sex   interface{}
   Class interface{} `json:"class"`
   Test  interface{}
}

// Class TODO
type Class struct {
   Name  string
   Grade int
}

func main() {
   // json字符中的"引号,需用\进行转义,否则编译出错
   // json字符串沿用上面的结果,但对key进行了大小的修改,并添加了sex数据
   data := "{\"name\":\"张三\",\"Age\":18,\"high\":true,\"sex\":\"男\",\"CLASS\":{\"naME\":\"1班\",\"GradE\":3}}"
   str := []byte(data)

   // 1.Unmarshal的第一个参数是json字符串,第二个参数是接受json解析的数据结构。
   // 第二个参数必须是指针,否则无法接收解析的数据,如stu仍为空对象StuRead{}
   // 2.可以直接stu:=new(StuRead),此时的stu自身就是指针
   stu := StuRead{}
   err := json.Unmarshal(str, &stu)

   // 解析失败会报错,如json字符串格式不对,缺"号,缺}等。
   if err != nil {
      fmt.Println(err)
   }

   fmt.Println(stu)
}

输出结果

代码语言:txt
复制
{张三 18 true 男 map[GradE:3 naME:1班] <nil>}

参考链接

  1. 理解 Go 中的 JSON
  2. Go的json解析:Marshal与Unmarshal

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一. struct转json
    • 例1
      • 例2
        • 二. json转struct
        • 参考链接
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档