struct的json互相转换的实战

本文介绍了Go语言中如何将struct转换为json以及json转换为struct的方法。通过示例展示了`json`标签的使用,包括忽略指定字段的转换。同时,提供了一个json字符串到struct的解析示例,演示了解析过程及注意事项。
摘要由CSDN通过智能技术生成

一. struct转json

表示我要把相关的字段编码进结构体中
Struct tag “-” 表示跳过指定的 filed:

例1

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

输出

{"some_field":"Alice","Time":234234234}

例2

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

输出结果:

{"name":"张三","Age":18,"HIgh":true,"class":{"Name":"1班","Grade":3}}

二. json转struct

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

输出结果

{张三 18 true 男 map[GradE:3 naME:1班] <nil>}

参考链接

  1. 理解 Go 中的 JSON
  2. Go的json解析:Marshal与Unmarshal
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爽朗地狮子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值