jsoniterpb
Replacement of Protojson over Jsoniter Extension
Features
- Most of the features are the same as protojson
- Support for objects that do not implement
proto.Message
- Support more fuzzy decode methods
- Better performance
Compatibility test
cd ./internal/protojson && go run ./gen.go
, it will download the latest tests file from protocolbuffers/protobuf-go
and make it available to jsoniterpb
Warns
Some differences with protojson
- Only
proto3
is supported,proto2
is not supported protojson
marshal nilproto.Message
as zero value if it is root. butjsoniterpb
will marshal it tonull
- View internal/protojson/tests/jsoniterpb_decode_test.go
- Support more fuzzy decode methods => Search
FuzzyDecode
- Most error messages are not the same => Search
ErrMsgNotSame
- Some error check are not supported => Search
NotSupport
- Support more fuzzy decode methods => Search
Usage
Since the current extensibility of json-iterator/go is not enough to complete this project, it needs to be replaced with another version.
// go.mod
// go get github.com/molon/jsoniter@jsoniterpb
replace github.com/json-iterator/go => github.com/molon/jsoniter v0.0.0-20220928114115-9bbeedd3bb95
// protojson.MarshalOptions{}
cfg := jsoniter.Config{SortMapKeys: true, DisallowUnknownFields: true}.Froze()
cfg.RegisterExtension(&jsoniterpb.ProtoExtension{})
// protojson.MarshalOptions{EmitUnpopulated: true}
cfg := jsoniter.Config{SortMapKeys: true, DisallowUnknownFields: true}.Froze()
cfg.RegisterExtension(&jsoniterpb.ProtoExtension{EmitUnpopulated: true})
// protojson.UnmarshalOptions{DiscardUnknown: true}
cfg := jsoniter.Config{SortMapKeys: true, DisallowUnknownFields: false}.Froze()
cfg.RegisterExtension(&jsoniterpb.ProtoExtension{})
Benchmark
BenchmarkWrite/protojson
BenchmarkWrite/protojson-8 4759 251567 ns/op 121746 B/op 2380 allocs/op
BenchmarkWrite/jsoniter
BenchmarkWrite/jsoniter-8 6506 177602 ns/op 88752 B/op 2322 allocs/op
BenchmarkWrite/jsoniter-fast
BenchmarkWrite/jsoniter-fast-8 10000 112298 ns/op 48103 B/op 1150 allocs/op
BenchmarkRead/protojson
BenchmarkRead/protojson-8 3120 384538 ns/op 115852 B/op 4137 allocs/op
BenchmarkRead/jsoniter
BenchmarkRead/jsoniter-8 5943 200014 ns/op 87369 B/op 2787 allocs/op
BenchmarkRead/jsoniter-fast
BenchmarkRead/jsoniter-fast-8 6291 193630 ns/op 87441 B/op 2781 allocs/op
BenchmarkRead/jsoniter-nofuzzydecode
BenchmarkRead/jsoniter-nofuzzydecode-8 6241 174049 ns/op 74271 B/op 2167 allocs/op
BenchmarkRead/jsoniter-fast-nofuzzydecode
BenchmarkRead/jsoniter-fast-nofuzzydecode-8 6708 166749 ns/op 74963 B/op 2172 allocs/op