diff --git a/ygot/render.go b/ygot/render.go index 92af99de2..7b7c958be 100644 --- a/ygot/render.go +++ b/ygot/render.go @@ -1258,6 +1258,10 @@ func mapJSON(field reflect.Value, parentMod string, args jsonOutputConfig) (inte sort.Strings(mapKeys) if len(mapKeys) == 0 { + // empty list should be encoded as empty list + if args.jType == RFC7951 { + return []interface{}{}, nil + } return nil, nil } diff --git a/ygot/render_test.go b/ygot/render_test.go index 53a3e1928..201c00fe8 100644 --- a/ygot/render_test.go +++ b/ygot/render_test.go @@ -1988,6 +1988,22 @@ func TestConstructJSON(t *testing.T) { }, List: map[uint32]*renderExampleList{}, }, + wantIETF: map[string]interface{}{ + "ch": map[string]interface{}{"val": "42"}, + /// RFC7951 Section 5.4 defines a YANG list as an JSON array. Per RFC 8259 Section 5 an empty array should be [] rather than 'null'. + "list": []interface{}{}, + }, + wantInternal: map[string]interface{}{ + "ch": map[string]interface{}{"val": 42}, + }, + }, { + name: "empty map nil", + in: &renderExample{ + Ch: &renderExampleChild{ + Val: Uint64(42), + }, + List: nil, + }, wantIETF: map[string]interface{}{ "ch": map[string]interface{}{"val": "42"}, }, @@ -3370,7 +3386,8 @@ func TestMarshal7951(t *testing.T) { }, { desc: "empty map", in: map[string]*renderExample{}, - want: `null`, + // null as empty array is not valid, RFC7951 section 5.4 specify that the array must be an array, and JSON empty arrays are not null value + want: `[]`, }, { desc: "nil string pointer", in: (*string)(nil),