当前位置:首页 > Golang杂记 > 正文内容

Go easyjson使用技巧

2个月前 (04-17)Golang杂记172

如果使用go语言自带的json库,使用的是反射,而go语言中反射性能较低。easyjson就是一个比较好的替代方案。

esayjson安装(https://gitcode.net/mirrors/mailru/easyjson?utm_source=csdn_github_accelerator)

go get -u github.com/mailru/easyjson
go install  github.com/mailru/easyjson/easyjsonorgo 
go build -o easyjson github.com/mailru/easyjson/easyjson(这里默认在当前目录生成easyjson二进制可执行文件)

安装easyjson

# for Go < 1.17 
go get -u github.com/mailru/easyjson/...
# for Go >= 1.17 
go get github.com/mailru/easyjson && go install github.com/mailru/easyjson/...@latest

先说下我的环境:win10,go1.18,如下图

image.png

G:\web\demo>easyjson
Usage of easyjson:
  -all
        generate marshaler/unmarshalers for all structs in a file
  -build_tags string
        build tags to add to generated file
  -byte
        use simple bytes instead of Base64Bytes for slice of bytes
  -disable_members_unescape
        don't perform unescaping of member names to improve performance
  -disallow_unknown_fields
        return error if any unknown field in json appeared
  -gen_build_flags string
        build flags when running the generator while bootstrapping
  -leave_temps
        do not delete temporary files
  -lower_camel_case
        use lowerCamelCase names instead of CamelCase by default
  -no_std_marshalers
        don't generate MarshalJSON/UnmarshalJSON funcs
  -noformat
        do not run 'gofmt -w' on output file
  -omit_empty
        omit empty fields by default
  -output_filename string
        specify the filename of the output
  -pkg
        process the whole package instead of just the given file
  -snake_case
        use snake_case names instead of CamelCase by default
  -stubs
        only generate stubs for marshaler/unmarshaler funcs

其中有几个选项需要注意:

-lower_camel_case:将结构体字段field首字母改为小写。如Name=>name。  
-build_tags string:将指定的string生成到生成的go文件头部。  
-no_std_marshalers:不为结构体生成MarshalJSON/UnmarshalJSON函数。  
-omit_empty:没有赋值的field可以不生成到json,否则field为该字段类型的默认值。
-output_filename:定义生成的文件名称。
-pkg:对包内指定有`//easyjson:json`结构体生成对应的easyjson配置。
-snke_case:可以下划线的field如`Name_Student`改为`name_student`。

安装完毕后,GOPATH里bin下就有easyjson.exe。

使用go env 查看如我的gopath为: C:\Users\77293\go

image.png

使用easyjson

go mod init demo

比如我的当前工作目录demo下初始化mod,创建一个文件夹model,在model下新建student.go文件

定义结构体:

记得在需要使用easyjson的结构体上加上//model:json 标注。 此处model是我的包路径名即为model,代码如下:

package model

import "time"

//model:json
type School struct {
    Name string `json:"name"`
    Addr string `json:"addr"`
}

//model:json
type Student struct {
    Id       int       `json:"id"`
    Name     string    `json:"s_name"`
    School   School    `json:"s_chool"`
    Birthday time.Time `json:"birthday"`
}

可以进入结构体包model下执行:

easyjson -all student.go

image.png
运行完后,该文件夹中有一个student_easyjson.go,该文件中就是easyjson帮我们生成的MarshalJSON和UnmarshalJSON方法.

image.png

使用示例

package main

import (
    "demo/model"
    "fmt"
    "time"
)

func main() {
    s := model.Student{
        Id:   11,
        Name: "qq",
        School: model.School{
            Name: "CUMT",
            Addr: "xz",
        },
        Birthday: time.Now(),
    }
    bt, err := s.MarshalJSON() // MarshalJSON
    fmt.Println(string(bt), err)

    json := `{"id":1,"s_name":"克莱尔","s_chool":{"name":"中南","addr":"wuhan"},"birthday":"2003-08-04T20:58:07.9894603+08:00"}`
    str := model.Student{}
    str.UnmarshalJSON([]byte(json)) // UnmarshalJSON
    fmt.Println(str)
}

运行结果:

{"id":11,"s_name":"qq","s_chool":{"name":"CUMT","addr":"xz"},"birthday":"2022-04-17T20:48:07.9274949+08:00"} <nil>
{1 克莱尔 {中南 wuhan} 2003-08-04 20:58:07.9894603 +0800 CST


小结:go自带JSON库使用的反射原理,性能相对较差,可以使用easyjson代替。

    扫描二维码推送至手机访问。

    版权声明:本文由周伯通的博客发布,如需转载请注明出处。

    本文链接:http://zhoubotong.site/post/37.html

    分享给朋友:

    相关文章

    Go常用排序算法

    常用的排序算法各种语言相同,这里大致介绍下go的常用排序,废话不多说,直入正题:冒泡排序package main import (    &q...

    go协程全局变量和局部变量

    大家可能经常会用到类似如下代码片段:package main import (    "fmt"   ...

    Go map定义的几种方式以及修改技巧

    直入正题,我们看下以下代码:package main import (    "encoding/json"  ...

    Go channel 协程为什么是安全的

        Channel跟java/php的 thread不一样,首先channel是协程不是线程。channel不会产生新的线程,自然不会涉及到新的进程或者线程...

    windows下编译linux可执行程序

    开发中,我们可以在Windows下编译Linux 64位可执行程序,首先获取目标系统所支持的构架,比如x86/x64/arm64/arm 等等。在 linux 系统中,我们可以使用命令 uname -...

    发表评论

    访客

    看不清,换一张

    ◎欢迎参与讨论,请在这里发表您的看法和观点。