[go]结构体和json转换

细说Golang的JSON解析
golang JSON技巧
Go - 如何解析 JSON 数据?mapstruct包

读写结构体

//写[obj,]
type user struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

m:= []user{
    {"m1",1},
    {"m2",2},
}

f, _ := os.Create("./data.txt")
b, _ := json.Marshal(m)
f.Write(b)
defer f.Close()

//读[obj,]

var arr []user

b, _ := ioutil.ReadFile("./data.txt") //会自动帮你初始化arr
json.Unmarshal(b, &arr)
fmt.Printf("%T,%v", arr, arr)

转为json忽略字段
转回来,采用struct默认值

鼠标停留在json.Marshal上看下帮助就一目了然了.

tag多数为struct转json时生效

/*
 // Field appears in JSON as key "myName".
  Field int `json:"myName"`  //理解为 Field in json

  // Field appears in JSON as key "myName" and
  // the field is omitted from the object if its value is empty,
  // as defined above.
  Field int `json:"myName,omitempty"`

  // Field appears in JSON as key "Field" (the default), but
  // the field is skipped if empty.
  // Note the leading comma.
  Field int `json:",omitempty"`

  // Field is ignored by this package.
  Field int `json:"-"`

  // Field appears in JSON as key "-".
  Field int `json:"-,"`
*/

后台出去时

// 出去时, 如果结构体是什么(有些字段指定了值,有些没有),就构建出什么样子的json
type user struct {
    Age  int    `json:"age"`
    Name string `json:"name"`
    //Age  int    `json:"age,omitempty"`
}

func main() {
    u := user{
        Name: "m1",
    }
    b, _ := json.Marshal(u)
    fmt.Println(string(b))
}

//{"age":0,"name":"m1"}
//如果是零值时,毙掉这个字段
//omitempty的字段: 如果改字段为零值,则毙掉这个字段
//结构体加了omitempty字段, 则出去时, 如果struct实例字段为零值, 则会毙掉这个字段
type user struct {
    Name string `json:"name"`
    //Age  int    `json:"age"`
    Age  int    `json:"age,omitempty"`
}

func main() {
    u := user{
        Name: "m1",
        Age:  0,
    }
    b, _ := json.Marshal(u)
    fmt.Println(string(b))
}

//{"name":"m1"}
// - 毙掉这个字段

type user struct {
    Name string `json:"name"`
    //Age  int    `json:"age"`
    //Age  int    `json:"age,omitempty"`
    Age int `json:"-"`
}

func main() {
    u := user{
        Name: "m1",
        Age:  0,
    }
    b, _ := json.Marshal(u)
    fmt.Println(string(b))
}

//{"name":"m1"}
// 转换结构体类型(如果转换失败,则保留原有类型,不会报错)

type user struct {
    Name string `json:"name"`
    //Age  int    `json:"age"`
    //Age  int    `json:"age,omitempty"`
    //Age int `json:"-"`
    Age int `json:",string"`
}

func main() {
    u := user{
        Name: "m1",
        Age:  22,
    }
    b, _ := json.Marshal(u)

    fmt.Println(string(b))
}

//{"name":"m1","Age":"22"}

前台进来时

// 进来时, 如果json类型和struct类型不匹配,则报错
type user struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func main() {
    var jsonStr = `
        {
            "name":"m1",
            "age":"22"
        }
    `
    var u user

    err := json.Unmarshal([]byte(jsonStr), &u)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(u)
}

//json: cannot unmarshal string into Go struct field user.age of type int
//{m1 0}
// 进来时,如果json字段里没有, 则struct以零值填充
type user struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func main() {
    var jsonStr = `
        {
            "name":"m1"
        }
    `
    var u user

    err := json.Unmarshal([]byte(jsonStr), &u)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(u)
}

//{m1 0}

原文地址:https://www.cnblogs.com/iiiiiher/p/12118352.html

时间: 2024-08-30 02:46:38

[go]结构体和json转换的相关文章

C结构体与Json字符串自动转换

我们知道在Java中利用Gson这个包可以很方便地将Object和Json进行自动转换(串行化/反串行化).其原理是利用了Java的反射机制. 最近我的项目中需要将C结构体与Json自动互转.项目背景其实是一个类似protobuf的json协议生成与解析,协议很多,所以我们肯定是希望从一个C结构体的对象自动转成Json,不然协议一条一条自己写,手筋要累断. 要实现这个需求,首先就要给C结构体加入反射机制.我的处理方法是让用户在定义结构体时,额外再定义一个metainfo,用于保存这个结构体的反射

60_通过结构体生成json

1.json是跨平台.跨语言的数据交换语言 JSON (JavaScript Object Notation)是一种比XML更轻量级的数据交换格式,在易于人们阅读和编写的同时,也易于程序解析和生成.尽管JSON是JavaScript的一个子集,但JSON采用完全独立于编程语言的文本格式,且表现为键/值对集合的文本描述形式(类似一些编程语言中的字典结构),这使它成为较为理想的.跨平台.跨语言的数据交换语言. package main import ( "encoding/json" &q

C#中结构体定义并转换字节数组

最近的项目在做socket通信报文解析的时候,用到了结构体与字节数组的转换:由于客户端采用C++开发,服务端采用C#开发,所以双方必须保证各自定义结构体成员类型和长度一致才能保证报文解析的正确性,这一点非常重要. 首先是结构体定义,一些基本的数据类型,C#与C++都是可以匹配的: [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] public struct Head { public

go语音之进阶篇通过结构体生成json

1.通过结构体生成json 示例: package main import ( "encoding/json" "fmt" ) //成员变量名首字母必须大写 type IT struct { Company string Subjects []string IsOk bool Price float64 } func main() { //定义一个结构体变量,同时初始化 s := IT{"itcast", []string{"Go&qu

c# 利用结构体获取json数据

最近做微信支付,要获取用户的openid,调用接口后返回的是json格式的数据,我想在c#后台把数据逐一取出,网上查了查,找到以下方法: 1.首先调用接口,要有一个post数据到指定url并返回数据的函数: protected string PostXmlToUrl(string url, string postData) { string returnmsg = ""; using (System.Net.WebClient wc = new System.Net.WebClient

golang结构体json的时间格式化解决方案

最近开发项目时候发现一个结构体的Json转换的时间格式问题. 即这种1993-01-01T20:08:23.000000028+08:00 这种表示UTC方法.从我们习惯来说,更喜欢希望的是 1993-01-01 20:08:23这种格式. 重新复现代码如下: package main import (     "time"     "encoding/json" ) type Student struct {     Name string     `json:&

C#结构体和字节数组的转换函数

在通信过程中,一般我们都会操作到字节数组.特别是希望在不同语言编程进行操作的时候. 虽然C#提供了序列化的支持,不用字节数组也行.但操作字节数组肯定会碰到. 一般都会采用结构来表示字节数组.但结构与字节数组直接的转换实在很麻烦. 字节操作不但容易出错,而且每增加一个结构,就自己实现一遍,实在是烦不胜烦. 有没有简单的方法呢?当然有.可以采用非托管区的一些方法来实现. 首先,导入命名空间:System.Runtime.InteropServices; 定义结构的时候,要给结构指定特性. 如: //

C结构体工具DirectStruct(综合示例二)

1.编写定义文件,用工具dsc处理之,自动生成XML转换代码和ESQL代码片段 2.编写应用代码 3.编译运行 ------------------------------------------------------------ DirectStruct是一个强有力的代码自动生成工具,它可以自动生成C结构体与XML.JSON.二进制(带压缩)等报文之间的转换代码,还能自动生成ESQL代码片段,在应用中直接使用自动化代码以提高开发效率,避免开发冗余和手工编码风险. 综合示例二演示了应用从数据库

现代 C++ 编译时 结构体字段反射

基于 C++ 14 原生语法,不到 100 行代码:让编译器帮你写 JSON 序列化/反序列化代码,告别体力劳动.?? 本文不讨论完整的 C++ 反射技术,只讨论结构体 (struct) 的字段 (field) 反射,及其在序列化/反序列化代码生成上的应用. 正文开始于 [sec|静态反射] 部分,其他部分都是铺垫..可以略读... 背景(TL;DR) 很多人喜欢把程序员称为 码农,程序员也经常嘲讽自己每天都在 搬砖.这时候,大家会想:能否构造出一些 更好的工具,代替我们做那些无意义的 体力劳动