@@ -233,6 +233,10 @@ func visitModelNode(model interface{}, included *map[string]*Node,
233
233
234
234
modelValue := value .Elem ()
235
235
modelType := value .Type ().Elem ()
236
+ var nullFields * []string
237
+ if _ , ok := modelType .FieldByName ("NullFields" ); ok {
238
+ nullFields = modelValue .FieldByName ("NullFields" ).Interface ().(* []string )
239
+ }
236
240
237
241
for i := 0 ; i < modelValue .NumField (); i ++ {
238
242
fieldValue := modelValue .Field (i )
@@ -348,15 +352,15 @@ func visitModelNode(model interface{}, included *map[string]*Node,
348
352
} else if fieldValue .Type () == reflect .TypeOf (new (time.Time )) {
349
353
// A time pointer may be nil
350
354
if fieldValue .IsNil () {
351
- if omitEmpty {
355
+ if omitEmpty && ! stringInSlice ( nullFields , structField . Name ) {
352
356
continue
353
357
}
354
358
355
359
node .Attributes [args [1 ]] = nil
356
360
} else {
357
361
tm := fieldValue .Interface ().(* time.Time )
358
362
359
- if tm .IsZero () && omitEmpty {
363
+ if tm .IsZero () && omitEmpty && ! stringInSlice ( nullFields , structField . Name ) {
360
364
continue
361
365
}
362
366
@@ -373,7 +377,7 @@ func visitModelNode(model interface{}, included *map[string]*Node,
373
377
emptyValue := reflect .Zero (fieldValue .Type ())
374
378
375
379
// See if we need to omit this field
376
- if omitEmpty && reflect .DeepEqual (fieldValue .Interface (), emptyValue .Interface ()) {
380
+ if omitEmpty && reflect .DeepEqual (fieldValue .Interface (), emptyValue .Interface ()) && ! stringInSlice ( nullFields , structField . Name ) {
377
381
continue
378
382
}
379
383
@@ -648,3 +652,16 @@ func convertToSliceInterface(i *interface{}) ([]interface{}, error) {
648
652
}
649
653
return response , nil
650
654
}
655
+
656
+ func stringInSlice (s * []string , v string ) bool {
657
+ if s == nil {
658
+ return false
659
+ }
660
+
661
+ for _ , field := range * s {
662
+ if field == v {
663
+ return true
664
+ }
665
+ }
666
+ return false
667
+ }
0 commit comments