使用 TOIT 语言将对象序列化/反序列化为 JSON

问题描述

我有几个关于使用 json 的问题。可以看到附带的库lib_v1.0.2中有对应的模块,但是示例中没有用到。是否可以举两个简单的例子:一个对象序列化一个json字符串,反序列化一个json到同一个对象中:例如通过constructor.json jsonString创建对象。如果可能的话,除了序列化/反序列化普通字段:strings,int,bool,解释如何序列化/反序列化 & 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"

这意味着它不能序列化/反序列化其他(用户定义的)类型的对象。

我已在此处提交功能请求:https://github.com/toitware/public/issues/6

,

我还没有测试复杂 json 对象的反序列化,但显然 TOIT 支持容器的序列化/反序列化,包括嵌套的。 例如一个列表:

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,toit,14]
a5->{fortran: [77,90]}
jsonObjList([1,covid-19,{fortran: [77,90]}])
listClone->([1,90]}])
aa1->1
aa2->2
aa3->covid-19
aa4->25
aa5->[11,14]
aa5->{fortran: [77,90]}
jsonObjListText-> [1,90]}]
listClone2->([1,90]}])
aaa1->1
aaa2->2
aaa3->covid-19
aaa4->25
aaa5->[11,14]
aaa6->{fortran: [77,90]}
michael_k@michaelk:~/toit_apps/json$