json-iterator / go

A high-performance 100% compatible drop-in replacement of "encoding/json"
http://jsoniter.com/migrate-from-go-std.html
MIT License
13.33k stars 1.02k forks source link

Bug: incompatibility with standard lib #680

Open bfreis opened 1 year ago

bfreis commented 1 year ago

According to the docs, it's possible to get 100% compatibility with the standard lib:

100% compatibility with standard lib

Replace

import "encoding/json"
json.Marshal(&data)

with


import jsoniter "github.com/json-iterator/go"

var json = jsoniter.ConfigCompatibleWithStandardLibrary json.Marshal(&data)



I found a case in which this doesn't happen: https://go.dev/play/p/fSAa6wRtDKA

The key piece of the above playground is that, if a struct type has a method `MarshalJSON` with a _pointer_ receiver, and if there's a field of of a struct with the non-pointer type, the behavior diverge: the stdlib's `encoding/json` doesn't call `MarshalJSON`, but Jsoniter does. In the playground linked above, this is shown on the serialization of the field `BarNoPtr`.

Now, I'm not claiming that Jsoniter's behavior is _incorrect_ (I think it's reasonable behavior; in the very least, it's much more consistent than stdlib's behavior, as the full playground shows). The issue I'm bringing up is specifically the claim of 100% compatibility when using `jsoniter.ConfigCompatibleWithStandardLibrary`.