当前位置: 首页 > article >正文

【Go】EasyJson使用

EasyJson是Go语言中对象序列化与反序列化的工具,类似Java中的fastjson和Jackson,能快速对对象进行序列化和反序列化,本次介绍一下使用方法。

版本信息:

go1.20.2 

1,获取源码

# go get
go get -u github.com/mailru/easyjson/

2,安装

# install
go install github.com/mailru/easyjson/

如果失败,可以将项目克隆到$GOPATH/src/mailru 目录下 并将包名改为easyjson,然后进入easyjson包下的easyjson目录,运行go build 命令,再将生成的二进制文件放到$GOPATH/bin目录下并改名为easyjson

 也可以将二进制文件加到环境变量里。

我的go build路径如下

/home/easton/go/src/github.com/mailru/easyjson/easyjson
 

3,定义model文件

easyjson需要通过model文件生成对应的序列化和反序列化方法

项目结构:

test
├── src
│   └── easyjson
│       ├── easyjson_test.go
│       ├── struct_def.go
│       └── struct_def_easyjson.go

模型文件定义struct_def.go 

package easyjson

type BasicInfo struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}
type JobInfo struct {
	Skills []string `json:"skills"`
}
type Employee struct {
	BasicInfo BasicInfo `json:"basic_info"`
	JobInfo   JobInfo   `json:"job_info"`
}

4,执行命令生成工具文件

cd test/src/easyjson
easyjson -all struct_def.go

生产struct_def_easyjson.go,内容如下:

// MarshalJSON supports json.Marshaler interface
func (v Employee) MarshalJSON() ([]byte, error) {
	w := jwriter.Writer{}
	easyjson7c82d03EncodeGoproject01Day33Easyjson1(&w, v)
	return w.Buffer.BuildBytes(), w.Error
}

// MarshalEasyJSON supports easyjson.Marshaler interface
func (v Employee) MarshalEasyJSON(w *jwriter.Writer) {
	easyjson7c82d03EncodeGoproject01Day33Easyjson1(w, v)
}

// UnmarshalJSON supports json.Unmarshaler interface
func (v *Employee) UnmarshalJSON(data []byte) error {
	r := jlexer.Lexer{Data: data}
	easyjson7c82d03DecodeGoproject01Day33Easyjson1(&r, v)
	return r.Error()
}

5,测试 

创建easyjson_test.go,编写单元测试和性能测试方法如下:

package easyjson

import (
	"encoding/json"
	"testing"
)

var jsonStr = `{
	"basic_info":{
	  	"name":"Mike",
		"age":30
	},
	"job_info":{
		"skills":["Java","Go","C"]
	}
}`

func TestEasyJson(t *testing.T) {
	e := Employee{}
	err := e.UnmarshalJSON([]byte(jsonStr))
	if err != nil {
		t.Fatal("json to obj error", err.Error())
	}
	t.Log(e)
	//对象转化为json
	bytes, err1 := e.MarshalJSON()
	if err1 != nil {
		t.Fatal("object to json error", err1.Error())
	}
	t.Log(string(bytes))
}

func BenchmarkEasyJson(b *testing.B) {
	b.ResetTimer()
	e := Employee{}
	for i := 0; i < b.N; i++ {
		err := e.UnmarshalJSON([]byte(jsonStr))
		if err != nil {
			b.Error("EasyJson: json to object error", err.Error())
		}
		_, err1 := e.MarshalJSON()
		if err1 != nil {
			b.Error("EasyJson: object to json error", err1.Error())
		}
	}

}

func BenchmarkEmbeddedJson(b *testing.B) {
	b.ResetTimer()
	e := Employee{}
	for i := 0; i < b.N; i++ {
		err := json.Unmarshal([]byte(jsonStr), &e)
		if err != nil {
			b.Error("Embedded: json to object error", err.Error())
		}
		//obj to json
		_, err1 := json.Marshal(e)
		if err1 != nil {
			b.Error("Embedded: object to json error", err1.Error())
		}
	}
}

 测试Embedded json 与EasyJson性能对比

cd test/src/easyjson/
go test -bench=. benchmem

性能测试结果如下:

pkg: test/easyjson
BenchmarkEasyJson-10        	 2773292	       425.5 ns/op	     252 B/op	       5 allocs/op
BenchmarkEmbeddedJson-10    	  752252	      1552 ns/op	     584 B/op	      11 allocs/op
PASS
ok  	test/easyjson	2.921s

EasyJson官网地址 

Github地址:https://github.com/mailru/easyjson


http://www.kler.cn/news/155315.html

相关文章:

  • Maven 进阶学习指南---setting详解
  • 测试Centos上用Gunicorn启动的Django-Web服务在Django源文件有改变的情况下能否自动重载最新源码下的web服务
  • 数据结构奇妙旅程之顺序表和链表
  • 进行主从复制时出现的异常FATAL CONFIG FILE ERROR (Redis 6.2.6)Reading the configuration file
  • Bean的加载方式
  • 利用vue3SeamlessScroll简单实现列表的无限循环滚动
  • V8引擎类型转换(VIP课程)
  • ConvBNReLU的作用
  • mac 聚焦搜索不显示
  • 三十六、seata的部署和集成
  • 前端面试JS—map 和 forEach 的区别
  • MxL3706-AQ-R 2.0通道绑定同轴网络集成电路特性
  • 模块 A:web理论测试
  • 「Python编程基础」第5章:列表
  • C语言/C++实战项目雷霆飞机(代码改进)
  • 【Unity动画】状态机中层的融合原理与用法详解
  • 如何在Rocky Linux中安装nmon
  • Oracle(2-7)Instance and Media Recovery Structures
  • DAPP【】nodejs安装与npm路径更换
  • redis.conf官方配置文件及sentinel.conf官方配置文件
  • 基于Python实现的滑动验证码自动识别工具源码
  • 【Vue3】源码解析-虚拟DOM
  • Vue2生命周期、Vue3生命周期及其对比
  • LeetCode的几道题
  • 程序员の养生之道
  • map优化对象数组
  • ThinkPHP 5 中,你可以使用定时任务调度器(TaskScheduler)来执行其他定时任务
  • Linux:动态查看服务器磁盘IO使用情况(IOTOP)
  • 若依框架分页
  • 栈和队列算法总结