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$