Skip to content

Commit 4188deb

Browse files
authored
x.json2: support @[skip] as well (#22077)
1 parent c8dc145 commit 4188deb

File tree

4 files changed

+57
-0
lines changed

4 files changed

+57
-0
lines changed

vlib/x/json2/decoder.v

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,9 @@ fn decode_struct[T](_ T, res map[string]Any) !T {
165165
mut json_name := field.name
166166

167167
for attr in field.attrs {
168+
if attr.contains('skip') {
169+
skip_field = true
170+
}
168171
if attr.contains('json: ') {
169172
json_name = attr.replace('json: ', '')
170173
if json_name == '-' {

vlib/x/json2/encoder.v

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,9 @@ fn (e &Encoder) encode_struct[U](val U, level int, mut buf []u8) ! {
200200
$for field in U.fields {
201201
mut @continue := false
202202
for attr in field.attrs {
203+
if attr.contains('skip') {
204+
@continue = true
205+
}
203206
if attr.contains('json: ') {
204207
if attr.replace('json: ', '') == '-' {
205208
@continue = true
@@ -227,6 +230,9 @@ fn (e &Encoder) encode_struct[U](val U, level int, mut buf []u8) ! {
227230
mut json_name := ''
228231

229232
for attr in field.attrs {
233+
if attr.contains('skip') {
234+
ignore_field = true
235+
}
230236
if attr.contains('json: ') {
231237
json_name = attr.replace('json: ', '')
232238
if json_name == '-' {

vlib/x/json2/tests/decode_struct_test.v

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,22 @@ mut:
7373
val map[string]string @[json: '-']
7474
}
7575

76+
struct StructTypeSkippedFields5[T] {
77+
mut:
78+
val T @[skip]
79+
val1 T @[skip]
80+
val2 T @[skip]
81+
val3 T @[skip]
82+
}
83+
84+
struct StructTypeSkippedFields6[T] {
85+
mut:
86+
val T
87+
val1 T @[skip]
88+
val2 T
89+
val3 T @[skip]
90+
}
91+
7692
fn test_types() {
7793
assert json.decode[StructType[string]]('{"val": ""}')!.val == ''
7894
assert json.decode[StructType[string]]('{"val": "0"}')!.val == '0'
@@ -188,4 +204,22 @@ fn test_skipped_fields() {
188204
} else {
189205
assert false
190206
}
207+
208+
if x := json.decode[StructTypeSkippedFields5[int]]('{"val":10,"val1":10,"val2":10,"val3":10}') {
209+
assert x.val == 0
210+
assert x.val1 == 0
211+
assert x.val2 == 0
212+
assert x.val3 == 0
213+
} else {
214+
assert false
215+
}
216+
217+
if x := json.decode[StructTypeSkippedFields6[int]]('{"val":10,"val1":10,"val2":10,"val3":10}') {
218+
assert x.val == 10
219+
assert x.val1 == 0
220+
assert x.val2 == 10
221+
assert x.val3 == 0
222+
} else {
223+
assert false
224+
}
191225
}

vlib/x/json2/tests/encode_struct_skippable_fields_test.v

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,14 @@ mut:
7373
val3 time.Time @[json: '-']
7474
}
7575

76+
struct StructTypeSkippedFields9 {
77+
mut:
78+
val string
79+
val1 i64 @[skip]
80+
val2 f64
81+
val3 time.Time @[skip]
82+
}
83+
7684
fn test_encode_struct_skipped_fields() {
7785
assert json.encode(StructTypeSkippedFields[string]{
7886
val: 'string_val'
@@ -131,4 +139,10 @@ fn test_encode_struct_skipped_fields() {
131139
val1: 1
132140
val2: 1.0
133141
}) == '{"val":"string_val","val2":1.0}'
142+
143+
assert json.encode(StructTypeSkippedFields9{
144+
val: 'string_val'
145+
val1: 1
146+
val2: 1.0
147+
}) == '{"val":"string_val","val2":1.0}'
134148
}

0 commit comments

Comments
 (0)