goavro icon indicating copy to clipboard operation
goavro copied to clipboard

Support unambiguous JSON (from/to)

Open Emptyless opened this issue 1 year ago • 0 comments

NewCodecForUnambiguousJSON provides full serialization/deserialization for json that is unambiguous in terms of what the field will contain. This means that avro Union types containing only a single concrete type e.g. ["null", "string"] no longer have to specify their type. Unlike NewCodecForStandardJSONFull, ambiguous types ["int", "string"] do still need to specify their type as map. See the following examples:

["null", "string"] => "some string" || null
["int", "string"] => {"int": 1} || {"string": "some string"}
["null", "int", "string"] => null || {"int": 1} || {"string": "some string"}

this is especially useful when using json.Marshal, json.Unmarshal with structs containing optional types:

type Person struct {
   Name *string `json:"name,omitempty"`
}

or using json.Marshal,json.Unmarshal with structs containing a union:

type Message struct {
   Direction DirectionUnion `json:DirectionUnion"
}

type DirectionUnion struct { // only one of the fields can be non-nil
   Request *string `json:"request,omitempty"`
   Response *string `json:"response,omitempty"`
}

I have added example tests for (un)ambiguous nil, primitive and records native-to-textual and vice-versa

Emptyless avatar Mar 15 '24 16:03 Emptyless