mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
json: add support for aliased struct fields (#6556)
This commit is contained in:
@ -171,7 +171,6 @@ struct Data {
|
||||
|
||||
fn test_nested_type() {
|
||||
data_expected := '{"countries":[{"cities":[{"name":"London"},{"name":"Manchester"}],"name":"UK"},{"cities":[{"name":"Donlon"},{"name":"Termanches"}],"name":"KU"}],"users":{"Foo":{"age":10,"nums":[1,2,3],"lastName":"Johnson","IsRegistered":true,"type":0,"pet_animals":"little foo"},"Boo":{"age":20,"nums":[5,3,1],"lastName":"Smith","IsRegistered":false,"type":4,"pet_animals":"little boo"}},"extra":{"2":{"n1":2,"n2":4,"n3":8,"n4":16},"3":{"n1":3,"n2":9,"n3":27,"n4":81}}}'
|
||||
|
||||
data := Data{
|
||||
countries: [
|
||||
Country{
|
||||
@ -195,7 +194,7 @@ fn test_nested_type() {
|
||||
is_registered: true
|
||||
typ: 0
|
||||
pets: 'little foo'
|
||||
},
|
||||
}
|
||||
'Boo': User{
|
||||
age: 20
|
||||
nums: [5, 3, 1]
|
||||
@ -204,39 +203,37 @@ fn test_nested_type() {
|
||||
typ: 4
|
||||
pets: 'little boo'
|
||||
}
|
||||
},
|
||||
}
|
||||
extra: {
|
||||
'2': {
|
||||
'n1': 2
|
||||
'n2': 4
|
||||
'n3': 8
|
||||
'n4': 16
|
||||
},
|
||||
}
|
||||
'3': {
|
||||
'n1': 3
|
||||
'n2': 9
|
||||
'n3': 27
|
||||
'n4': 81
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
out := json.encode(data)
|
||||
println(out)
|
||||
assert out == data_expected
|
||||
|
||||
data2 := json.decode(Data, data_expected) or {
|
||||
assert false
|
||||
Data{}
|
||||
}
|
||||
assert data2.countries.len == data.countries.len
|
||||
for i in 0..1 {
|
||||
for i in 0 .. 1 {
|
||||
assert data2.countries[i].name == data.countries[i].name
|
||||
assert data2.countries[i].cities.len == data.countries[i].cities.len
|
||||
for j in 0..1 {
|
||||
for j in 0 .. 1 {
|
||||
assert data2.countries[i].cities[j].name == data.countries[i].cities[j].name
|
||||
}
|
||||
}
|
||||
|
||||
for key, user in data.users {
|
||||
assert data2.users[key].age == user.age
|
||||
assert data2.users[key].nums == user.nums
|
||||
@ -245,7 +242,6 @@ fn test_nested_type() {
|
||||
assert data2.users[key].typ == user.typ
|
||||
// assert data2.users[key].pets == user.pets // TODO FIX
|
||||
}
|
||||
|
||||
for k, v in data.extra {
|
||||
for k2, v2 in v {
|
||||
assert data2.extra[k][k2] == v2
|
||||
@ -263,11 +259,9 @@ fn test_generic_struct() {
|
||||
foo_int := Foo<int>{'bar', 12}
|
||||
foo_enc := json.encode(foo_int)
|
||||
assert foo_enc == '{"name":"bar","data":12}'
|
||||
|
||||
foo_dec := json.decode(Foo<int>, foo_enc) or {
|
||||
exit(1)
|
||||
}
|
||||
|
||||
assert foo_dec.name == 'bar'
|
||||
assert foo_dec.data == 12
|
||||
}
|
||||
@ -275,7 +269,6 @@ fn test_generic_struct() {
|
||||
fn test_errors() {
|
||||
invalid_array := fn () {
|
||||
data := '{"countries":[{"cities":[{"name":"London"},{"name":"Manchester"}],"name":"UK"},{"cities":{"name":"Donlon"},"name":"KU"}],"users":{"Foo":{"age":10,"nums":[1,2,3],"lastName":"Johnson","IsRegistered":true,"type":0,"pet_animals":"little foo"},"Boo":{"age":20,"nums":[5,3,1],"lastName":"Smith","IsRegistered":false,"type":4,"pet_animals":"little boo"}},"extra":{"2":{"n1":2,"n2":4,"n3":8,"n4":16},"3":{"n1":3,"n2":9,"n3":27,"n4":81}}}'
|
||||
|
||||
json.decode(Data, data) or {
|
||||
println(err)
|
||||
assert err.starts_with('Json element is not an array:')
|
||||
@ -283,9 +276,8 @@ fn test_errors() {
|
||||
}
|
||||
assert false
|
||||
}
|
||||
invalid_object := fn() {
|
||||
invalid_object := fn () {
|
||||
data := '{"countries":[{"cities":[{"name":"London"},{"name":"Manchester"}],"name":"UK"},{"cities":[{"name":"Donlon"},{"name":"Termanches"}],"name":"KU"}],"users":[{"age":10,"nums":[1,2,3],"lastName":"Johnson","IsRegistered":true,"type":0,"pet_animals":"little foo"},{"age":20,"nums":[5,3,1],"lastName":"Smith","IsRegistered":false,"type":4,"pet_animals":"little boo"}],"extra":{"2":{"n1":2,"n2":4,"n3":8,"n4":16},"3":{"n1":3,"n2":9,"n3":27,"n4":81}}}'
|
||||
|
||||
json.decode(Data, data) or {
|
||||
println(err)
|
||||
assert err.starts_with('Json element is not an object:')
|
||||
@ -296,3 +288,25 @@ fn test_errors() {
|
||||
invalid_array()
|
||||
invalid_object()
|
||||
}
|
||||
|
||||
type ID = string
|
||||
|
||||
struct Message {
|
||||
id ID
|
||||
}
|
||||
|
||||
fn test_decode_alias_struct() {
|
||||
msg := json.decode(Message, '{"id": "118499178790780929"}') or {
|
||||
assert false
|
||||
Message{}
|
||||
}
|
||||
// hacky way of comparing aliased strings
|
||||
assert msg.id.str() == '118499178790780929'
|
||||
}
|
||||
|
||||
fn test_encode_alias_struct() {
|
||||
expected := '{"id":"118499178790780929"}'
|
||||
msg := Message{'118499178790780929'}
|
||||
out := json.encode(msg)
|
||||
assert out == expected
|
||||
}
|
||||
|
Reference in New Issue
Block a user