mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
json: fix omitempty for alias, struct, sumtype, array and map (#18012)
This commit is contained in:
parent
89b7bebc3c
commit
3d50663bcf
104
vlib/json/json_omitempty_types_test.v
Normal file
104
vlib/json/json_omitempty_types_test.v
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
import json
|
||||||
|
|
||||||
|
struct OmitEmptyStruct {
|
||||||
|
bug Struct [omitempty]
|
||||||
|
}
|
||||||
|
|
||||||
|
type MyAlias = string
|
||||||
|
|
||||||
|
struct OmitEmptyAlias {
|
||||||
|
bug MyAlias [omitempty]
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Struct {
|
||||||
|
name string
|
||||||
|
}
|
||||||
|
|
||||||
|
struct OmitEmptyMap {
|
||||||
|
bug map[string]string [omitempty]
|
||||||
|
}
|
||||||
|
|
||||||
|
struct OmitEmptyArray {
|
||||||
|
bug []string [omitempty]
|
||||||
|
}
|
||||||
|
|
||||||
|
type MySum = int | string
|
||||||
|
|
||||||
|
struct OmitEmptySumType {
|
||||||
|
bug MySum [omitempty]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
test_struct()
|
||||||
|
test_alias()
|
||||||
|
test_map()
|
||||||
|
test_sumtype()
|
||||||
|
test_array()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_struct() {
|
||||||
|
test2 := OmitEmptyStruct{
|
||||||
|
bug: Struct{}
|
||||||
|
}
|
||||||
|
encoded2 := json.encode(test2)
|
||||||
|
dump(encoded2)
|
||||||
|
test := OmitEmptyStruct{
|
||||||
|
bug: Struct{
|
||||||
|
name: 'mybug'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
encoded := json.encode(test)
|
||||||
|
dump(encoded)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_alias() {
|
||||||
|
test3 := OmitEmptyAlias{
|
||||||
|
bug: ''
|
||||||
|
}
|
||||||
|
encoded3 := json.encode(test3)
|
||||||
|
dump(encoded3)
|
||||||
|
test4 := OmitEmptyAlias{
|
||||||
|
bug: 'foo'
|
||||||
|
}
|
||||||
|
encoded4 := json.encode(test4)
|
||||||
|
dump(encoded4)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_map() {
|
||||||
|
test3 := OmitEmptyMap{
|
||||||
|
bug: {}
|
||||||
|
}
|
||||||
|
encoded3 := json.encode(test3)
|
||||||
|
dump(encoded3)
|
||||||
|
test4 := OmitEmptyMap{
|
||||||
|
bug: {
|
||||||
|
'foo': 'bar'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
encoded4 := json.encode(test4)
|
||||||
|
dump(encoded4)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_sumtype() {
|
||||||
|
test3 := OmitEmptySumType{}
|
||||||
|
encoded3 := json.encode(test3)
|
||||||
|
dump(encoded3)
|
||||||
|
test4 := OmitEmptySumType{
|
||||||
|
bug: 1
|
||||||
|
}
|
||||||
|
encoded4 := json.encode(test4)
|
||||||
|
dump(encoded4)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_array() {
|
||||||
|
test3 := OmitEmptyArray{
|
||||||
|
bug: []
|
||||||
|
}
|
||||||
|
encoded3 := json.encode(test3)
|
||||||
|
dump(encoded3)
|
||||||
|
test4 := OmitEmptyArray{
|
||||||
|
bug: ['1']
|
||||||
|
}
|
||||||
|
encoded4 := json.encode(test4)
|
||||||
|
dump(encoded4)
|
||||||
|
}
|
@ -693,10 +693,25 @@ fn (mut g Gen) gen_struct_enc_dec(utyp ast.Type, type_info ast.TypeInfo, styp st
|
|||||||
enc.writeln('${indent}if (${prefix_enc}${op}${c_name(field.name)}.state != 2)')
|
enc.writeln('${indent}if (${prefix_enc}${op}${c_name(field.name)}.state != 2)')
|
||||||
} else if field.typ == ast.string_type {
|
} else if field.typ == ast.string_type {
|
||||||
enc.writeln('${indent}if (${prefix_enc}${op}${c_name(field.name)}.len != 0)')
|
enc.writeln('${indent}if (${prefix_enc}${op}${c_name(field.name)}.len != 0)')
|
||||||
|
} else {
|
||||||
|
if field_sym.kind in [.alias, .sum_type, .map, .array, .struct_] {
|
||||||
|
ptr_typ := g.equality_fn(field.typ)
|
||||||
|
if field_sym.kind == .alias {
|
||||||
|
enc.writeln('${indent}if (!${ptr_typ}_alias_eq(${prefix_enc}${op}${c_name(field.name)}, ${g.type_default(field.typ)}))')
|
||||||
|
} else if field_sym.kind == .sum_type {
|
||||||
|
enc.writeln('${indent}if (${prefix_enc}${op}${c_name(field.name)}._typ != 0)')
|
||||||
|
} else if field_sym.kind == .map {
|
||||||
|
enc.writeln('${indent}if (!${ptr_typ}_map_eq(${prefix_enc}${op}${c_name(field.name)}, ${g.type_default(field.typ)}))')
|
||||||
|
} else if field_sym.kind == .array {
|
||||||
|
enc.writeln('${indent}if (!${ptr_typ}_arr_eq(${prefix_enc}${op}${c_name(field.name)}, ${g.type_default(field.typ)}))')
|
||||||
|
} else if field_sym.kind == .struct_ {
|
||||||
|
enc.writeln('${indent}if (!${ptr_typ}_struct_eq(${prefix_enc}${op}${c_name(field.name)}, ${g.type_default(field.typ)}))')
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
enc.writeln('${indent}if (${prefix_enc}${op}${c_name(field.name)} != ${g.type_default(field.typ)})')
|
enc.writeln('${indent}if (${prefix_enc}${op}${c_name(field.name)} != ${g.type_default(field.typ)})')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if !is_js_prim(field_type) {
|
if !is_js_prim(field_type) {
|
||||||
if field_sym.kind == .alias {
|
if field_sym.kind == .alias {
|
||||||
ainfo := field_sym.info as ast.Alias
|
ainfo := field_sym.info as ast.Alias
|
||||||
|
Loading…
Reference in New Issue
Block a user