Serializing/deserializing 个对象 to/from JSON TOIT 语言
Serializing/deserializing objects to/from JSON on TOIT language
我有几个关于使用 json 的问题。可以看到附件库lib_v1.0.2中有对应的模块,但是例子中并没有用到。是否可以给出两个简单的例子:将一个对象序列化成一个json字符串和反序列化json成相同的对象:例如通过 constructor.json jsonString 创建的对象。如果可能,除了serializing/deserializing普通字段:strings, int, bool,说明如何serialize/deserialize & hash maps & lists 如果对象包含它们。
提前致谢,MK
目前,JSON 库仅支持类型的硬编码列表:
encode obj:
if obj is string: encode_string_ obj
else if obj is num: encode_number_ obj
else if identical obj true: encode_true_
else if identical obj false: encode_false_
else if identical obj null: encode_null_
else if obj is Map: encode_map_ obj
else if obj is List: encode_list_ obj
else: throw "INVALID_JSON_OBJECT"
这意味着它不能 serialize/deserialize 其他(用户定义的)类型的对象。
我已在此处提交功能请求:https://github.com/toitware/public/issues/6
我还没有测试复杂 json 对象的反序列化,但显然 TOIT 支持 serialization/deserialization 容器,包括嵌套容器。
例如列表:
import encoding.json as json
main :
list := [1,2,"covid-19",25,[11,12,"toit",13,14],{"fortran":[77,90]}]
a1 := list[0]
log("a1->$a1")
a2 := list[1]
log("a2->$a2")
a3 := list[2]
log("a3->$a3")
a4 := list[3]
log("a4->$a4")
a5 := list[4]
log("a5->$a5")
a6 := list[5]
log("a5->$a6")
jsonObjList := json.encode list
log("jsonObjList($list)")
listClone := json.decode jsonObjList
log("listClone->($list)")
aa1 := listClone[0]
log("aa1->$aa1")
aa2 := listClone[1]
log("aa2->$aa2")
aa3 := listClone[2]
log("aa3->$aa3")
aa4 := listClone[3]
log("aa4->$aa4")
aa5 := listClone[4]
log("aa5->$aa5")
aa6 := listClone[5]
log("aa5->$aa6")
jsonObjListText := jsonObjList.to_string
log("jsonObjListText-> $jsonObjListText")
listClone2 := json.decode jsonObjListText.to_byte_array
log("listClone2->($listClone2)")
aaa1 := listClone2[0]
log("aaa1->$aaa1")
aaa2 := listClone2[1]
log("aaa2->$aaa2")
aaa3 := listClone2[2]
log("aaa3->$aaa3")
aaa4 := listClone2[3]
log("aaa4->$aaa4")
aaa5 := listClone2[4]
log("aaa5->$aaa5")
aaa6 := listClone2[5]
log("aaa6->$aaa6")
输出:
michael_k@michaelk:~/toit_apps/json$ toit execute test_json.toit
a1->1
a2->2
a3->covid-19
a4->25
a5->[11, 12, toit, 13, 14]
a5->{fortran: [77, 90]}
jsonObjList([1, 2, covid-19, 25, [11, 12, toit, 13, 14], {fortran: [77, 90]}])
listClone->([1, 2, covid-19, 25, [11, 12, toit, 13, 14], {fortran: [77, 90]}])
aa1->1
aa2->2
aa3->covid-19
aa4->25
aa5->[11, 12, toit, 13, 14]
aa5->{fortran: [77, 90]}
jsonObjListText-> [1,2,"covid-19",25,[11,12,"toit",13,14],{"fortran":[77,90]}]
listClone2->([1, 2, covid-19, 25, [11, 12, toit, 13, 14], {fortran: [77, 90]}])
aaa1->1
aaa2->2
aaa3->covid-19
aaa4->25
aaa5->[11, 12, toit, 13, 14]
aaa6->{fortran: [77, 90]}
michael_k@michaelk:~/toit_apps/json$
我有几个关于使用 json 的问题。可以看到附件库lib_v1.0.2中有对应的模块,但是例子中并没有用到。是否可以给出两个简单的例子:将一个对象序列化成一个json字符串和反序列化json成相同的对象:例如通过 constructor.json jsonString 创建的对象。如果可能,除了serializing/deserializing普通字段:strings, int, bool,说明如何serialize/deserialize & hash maps & lists 如果对象包含它们。
提前致谢,MK
目前,JSON 库仅支持类型的硬编码列表:
encode obj:
if obj is string: encode_string_ obj
else if obj is num: encode_number_ obj
else if identical obj true: encode_true_
else if identical obj false: encode_false_
else if identical obj null: encode_null_
else if obj is Map: encode_map_ obj
else if obj is List: encode_list_ obj
else: throw "INVALID_JSON_OBJECT"
这意味着它不能 serialize/deserialize 其他(用户定义的)类型的对象。
我已在此处提交功能请求:https://github.com/toitware/public/issues/6
我还没有测试复杂 json 对象的反序列化,但显然 TOIT 支持 serialization/deserialization 容器,包括嵌套容器。 例如列表:
import encoding.json as json
main :
list := [1,2,"covid-19",25,[11,12,"toit",13,14],{"fortran":[77,90]}]
a1 := list[0]
log("a1->$a1")
a2 := list[1]
log("a2->$a2")
a3 := list[2]
log("a3->$a3")
a4 := list[3]
log("a4->$a4")
a5 := list[4]
log("a5->$a5")
a6 := list[5]
log("a5->$a6")
jsonObjList := json.encode list
log("jsonObjList($list)")
listClone := json.decode jsonObjList
log("listClone->($list)")
aa1 := listClone[0]
log("aa1->$aa1")
aa2 := listClone[1]
log("aa2->$aa2")
aa3 := listClone[2]
log("aa3->$aa3")
aa4 := listClone[3]
log("aa4->$aa4")
aa5 := listClone[4]
log("aa5->$aa5")
aa6 := listClone[5]
log("aa5->$aa6")
jsonObjListText := jsonObjList.to_string
log("jsonObjListText-> $jsonObjListText")
listClone2 := json.decode jsonObjListText.to_byte_array
log("listClone2->($listClone2)")
aaa1 := listClone2[0]
log("aaa1->$aaa1")
aaa2 := listClone2[1]
log("aaa2->$aaa2")
aaa3 := listClone2[2]
log("aaa3->$aaa3")
aaa4 := listClone2[3]
log("aaa4->$aaa4")
aaa5 := listClone2[4]
log("aaa5->$aaa5")
aaa6 := listClone2[5]
log("aaa6->$aaa6")
输出:
michael_k@michaelk:~/toit_apps/json$ toit execute test_json.toit
a1->1
a2->2
a3->covid-19
a4->25
a5->[11, 12, toit, 13, 14]
a5->{fortran: [77, 90]}
jsonObjList([1, 2, covid-19, 25, [11, 12, toit, 13, 14], {fortran: [77, 90]}])
listClone->([1, 2, covid-19, 25, [11, 12, toit, 13, 14], {fortran: [77, 90]}])
aa1->1
aa2->2
aa3->covid-19
aa4->25
aa5->[11, 12, toit, 13, 14]
aa5->{fortran: [77, 90]}
jsonObjListText-> [1,2,"covid-19",25,[11,12,"toit",13,14],{"fortran":[77,90]}]
listClone2->([1, 2, covid-19, 25, [11, 12, toit, 13, 14], {fortran: [77, 90]}])
aaa1->1
aaa2->2
aaa3->covid-19
aaa4->25
aaa5->[11, 12, toit, 13, 14]
aaa6->{fortran: [77, 90]}
michael_k@michaelk:~/toit_apps/json$