@@ -28,11 +28,17 @@ func (enc *Encoder) AddArray(v MarshalerJSONArray) {
2828}
2929
3030// AddArrayOmitEmpty adds an array or slice to be encoded, must be used inside a slice or array encoding (does not encode a key)
31- // value must implement Marshaler
31+ // value must implement MarshalerAddArrayOmitEmpty
3232func (enc * Encoder ) AddArrayOmitEmpty (v MarshalerJSONArray ) {
3333 enc .ArrayOmitEmpty (v )
3434}
3535
36+ // AddArrayNullEmpty adds an array or slice to be encoded, must be used inside a slice or array encoding (does not encode a key)
37+ // value must implement Marshaler, if v is empty, `null` will be encoded`
38+ func (enc * Encoder ) AddArrayNullEmpty (v MarshalerJSONArray ) {
39+ enc .ArrayNullEmpty (v )
40+ }
41+
3642// AddArrayKey adds an array or slice to be encoded, must be used inside an object as it will encode a key
3743// value must implement Marshaler
3844func (enc * Encoder ) AddArrayKey (key string , v MarshalerJSONArray ) {
@@ -45,6 +51,12 @@ func (enc *Encoder) AddArrayKeyOmitEmpty(key string, v MarshalerJSONArray) {
4551 enc .ArrayKeyOmitEmpty (key , v )
4652}
4753
54+ // AddArrayKeyNullEmpty adds an array or slice to be encoded and skips it if it is nil.
55+ // Must be called inside an object as it will encode a key. `null` will be encoded`
56+ func (enc * Encoder ) AddArrayKeyNullEmpty (key string , v MarshalerJSONArray ) {
57+ enc .ArrayKeyNullEmpty (key , v )
58+ }
59+
4860// Array adds an implementation of MarshalerJSONArray to be encoded, must be used inside a slice or array encoding (does not encode a key)
4961// value must implement Marshaler
5062func (enc * Encoder ) Array (v MarshalerJSONArray ) {
@@ -84,6 +96,23 @@ func (enc *Encoder) ArrayOmitEmpty(v MarshalerJSONArray) {
8496 enc .writeByte (']' )
8597}
8698
99+ // ArrayNullEmpty adds an array or slice to be encoded, must be used inside a slice or array encoding (does not encode a key)
100+ // value must implement Marshaler
101+ func (enc * Encoder ) ArrayNullEmpty (v MarshalerJSONArray ) {
102+ enc .grow (4 )
103+ r := enc .getPreviousRune ()
104+ if r != '[' {
105+ enc .writeByte (',' )
106+ }
107+ if v .IsNil () {
108+ enc .writeBytes (nullBytes )
109+ return
110+ }
111+ enc .writeByte ('[' )
112+ v .MarshalJSONArray (enc )
113+ enc .writeByte (']' )
114+ }
115+
87116// ArrayKey adds an array or slice to be encoded, must be used inside an object as it will encode a key
88117// value must implement Marshaler
89118func (enc * Encoder ) ArrayKey (key string , v MarshalerJSONArray ) {
@@ -111,7 +140,7 @@ func (enc *Encoder) ArrayKey(key string, v MarshalerJSONArray) {
111140 enc .writeByte (']' )
112141}
113142
114- // ArrayKeyOmitEmpty adds an array or slice to be encoded and skips it if it is nil.
143+ // ArrayKeyOmitEmpty adds an array or slice to be encoded and skips if it is nil.
115144// Must be called inside an object as it will encode a key.
116145func (enc * Encoder ) ArrayKeyOmitEmpty (key string , v MarshalerJSONArray ) {
117146 if v .IsNil () {
@@ -129,6 +158,25 @@ func (enc *Encoder) ArrayKeyOmitEmpty(key string, v MarshalerJSONArray) {
129158 enc .writeByte (']' )
130159}
131160
161+ // ArrayKeyNullEmpty adds an array or slice to be encoded and encodes `null`` if it is nil.
162+ // Must be called inside an object as it will encode a key.
163+ func (enc * Encoder ) ArrayKeyNullEmpty (key string , v MarshalerJSONArray ) {
164+ enc .grow (5 + len (key ))
165+ r := enc .getPreviousRune ()
166+ if r != '{' {
167+ enc .writeByte (',' )
168+ }
169+ if v .IsNil () {
170+ enc .writeBytes (nullBytes )
171+ return
172+ }
173+ enc .writeByte ('"' )
174+ enc .writeStringEscape (key )
175+ enc .writeBytes (objKeyArr )
176+ v .MarshalJSONArray (enc )
177+ enc .writeByte (']' )
178+ }
179+
132180// EncodeArrayFunc is a custom func type implementing MarshaleArray.
133181// Use it to cast a func(*Encoder) to Marshal an object.
134182//
0 commit comments