jsoniter

详解PROTOCOL BUFFERS

十年热恋 提交于 2020-12-08 10:27:57
1. 前言 Protocal Buffers 是google推出的一种序列化协议。由于它的编码和解码的速度,已经编码后的大小控制的较好,因此它常常被用在RPC调用中,传递参数和结果。比如 gRPC 。 Protocal Buffers 的实现非常简单,本文将对比JSON协议,来聊聊Protocol Buffers的实现以及它高性能的秘密 2. 正篇 2.1 减少传输量(字段名和定界符) 汽车类在Golang中的定义 type Car struct { Age int32 `json:"age"` Color string `json:"color"` Price float32 `json:"price"` } JSON字符串表示 { "age": 10, "color": "red", "price": 15.2568983 } 1)”{” 、”}”、”[“, “]”、 双引号、”,” 、”:” 是为了把字段与字段之间,以及字段的名称和值分隔开。它们不是必须的。 2)字段的名称”age”、”color”、”price”也不是必须的。 如果发送方和接收方都对对象的定义是明晰的,那么字段的名称也不要传递 Protocol Buffers 对象定义 message Car { int32 age = 1; string color = 2; double price = 3; }

go中json使用小技巧总结

坚强是说给别人听的谎言 提交于 2020-08-20 06:31:35
有的时候上游传过来的字段是string类型的,但是我们却想用变成数字来使用。 本来用一个json:",string" 就可以支持了,如果不知道golang的这些小技巧,就要大费周章了。 参考文章:http://attilaolah.eu/2014/09/10/json-and-struct-composition-in-go/ 1. 临时忽略struct空字段 type User struct { Email string `json:"email"` Password string `json:"password"` // many more fields… } 如果想临时忽略掉空Password字段,可以用omitempty: json . Marshal ( struct { * User Password bool `json:"password,omitempty"` } { User : user , } ) 2. 解析成string类型 type User struct { Id uint64 `json:"id,string"` } func main ( ) { user := User { Id : 123 } bs , _ := json . Marshal ( user ) fmt . Println ( string ( bs ) ) } 输出 {“id”

Go 重构 PHP 项目的一个神器 jsoniter

故事扮演 提交于 2020-03-25 08:13:32
3 月,跳不动了?>>> Go 和 PHP 通信是痛苦的,PHP 这个神奇的 json ,各种奇奇怪怪的 json 都能生成出来,如果一开始就奇怪直接用interface也就算了,最可怕那种是类型会变。 在用 Go 重构 PHP 项目的时候,两个项目往往会共享存储,我们在生成缓存的时候,也经常把数据转成 json 去存储。 我大 PHP 生成 json 有这么两个另 Go 崩溃的事情,一个是 int 和 string 的不确定,第二个就是 PHP array是空的时候,序列化出来是[],但是不为空的时候,序列化出来的是{"key":"value"}。 但是 jsoniter ( https://github.com/json-iterator/go、http://jsoniter.com/go-tips.cn.html)对可以做模糊转换,省了很多事情。 看个例子 package main import ( "fmt" "github.com/json-iterator/go" "github.com/json-iterator/go/extra" ) func main() { extra.RegisterFuzzyDecoders() var i int var json = jsoniter.ConfigCompatibleWithStandardLibrary json