Add support of ignore tag for json.marshal

This commit is contained in:
VladPavliuk
2024-07-13 14:13:59 +03:00
parent d845a07519
commit 64ae99f016
2 changed files with 24 additions and 1 deletions
+3 -1
View File
@@ -406,7 +406,7 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err:
ti := runtime.type_info_base(type_info_of(v.id)) ti := runtime.type_info_base(type_info_of(v.id))
info := ti.variant.(runtime.Type_Info_Struct) info := ti.variant.(runtime.Type_Info_Struct)
first_iteration := true first_iteration := true
for name, i in info.names { fields_loop: for name, i in info.names {
omitempty := false omitempty := false
json_name, extra := json_name_from_tag_value(reflect.struct_tag_get(reflect.Struct_Tag(info.tags[i]), "json")) json_name, extra := json_name_from_tag_value(reflect.struct_tag_get(reflect.Struct_Tag(info.tags[i]), "json"))
@@ -414,6 +414,8 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err:
switch flag { switch flag {
case "omitempty": case "omitempty":
omitempty = true omitempty = true
case "ignore":
continue fields_loop
} }
} }
@@ -369,3 +369,24 @@ utf8_string_of_multibyte_characters :: proc(t: ^testing.T) {
defer json.destroy_value(val) defer json.destroy_value(val)
testing.expectf(t, err == nil, "Expected `json.parse` to return nil, got %v", err) testing.expectf(t, err == nil, "Expected `json.parse` to return nil, got %v", err)
} }
@test
struct_with_ignore_tags :: proc(t: ^testing.T) {
My_Struct :: struct {
a: string `json:"_,ignore"`,
}
my_struct := My_Struct{
a = "test",
}
my_struct_marshaled, marshal_err := json.marshal(my_struct)
defer delete(my_struct_marshaled)
testing.expectf(t, marshal_err == nil, "Expected `json.marshal` to return nil error, got %v", marshal_err)
my_struct_json := transmute(string)my_struct_marshaled
expected_json := `{}`
testing.expectf(t, expected_json == my_struct_json, "Expected `json.marshal` to return %s, got %s", expected_json, my_struct_json)
}