&|What|build JSON with tdom|& &|Requires|tdom 0.9.2|& &|tags|tdom|& &|reference|http://www.tdom.org/index.html/doc/trunk/doc/index.html|& &|Updated|30.05.2022|& ---- how to build a JSON like this: ====== { "aNumber": 0.123, "aNumberAsString": "0.123", "aString": "this is a String", "a key with spaces": "please take care on setting: dom setNameCheck 0", "aArray": ["a","b","c"], "aObject": { "foo":"that", "bar":"grill" }, "aObjectArray": [ { "foo": "objArray_01_foo", "bar": "objArray_01_bar", "array": ["five_01_a", "five_01_b", "five_01_c"] }, { "foo": "objArray_02_foo", "bar": "objArray_02_bar", "array": ["five_02_a", "five_02_b", "five_02_c"] } ] } ====== .. this is the script doing this: ====== # # --- load tdom --- # package require tdom 0.9 ;# current version: 0.9.2 (May, 2022) puts "tdom: [package versions tdom]" # # http://www.tdom.org/index.html/file?name=tests/domjson.test&ci=release # # set doc [dom createDocumentNode root] # puts "asXML: [$root asXML -indent 4]" puts "asJSON: [$root asJSON -indent 4]" # # -- aNumber -- # set node_Number [$doc createElement "aNumber" NONE] $node_Number appendChild [$doc createTextNode 0.123 NUMBER] $root appendChild $node_Number # # -- aNumberAsString -- # set node_StringNum [$doc createElement "aNumberAsString" NONE] $node_StringNum appendChild [$doc createTextNode 0.123 NUMBER] $root appendChild $node_StringNum # # -- aString -- # set node_String [$doc createElement "aNumberString" NONE] $node_String appendChild [$doc createTextNode "0.123" NUMBER] $root appendChild $node_String # set node_String [$doc createElement "aString" NONE] $node_String appendChild [$doc createTextNode "this is a String" STRING] $root appendChild $node_String # # -- a key with spaces -- # # ... you have to disable namecheck first dom setNameCheck 0 set node_String [$doc createElement "a key with spaces" NONE] # [dom setNameCheck] == 1 ... brings this error # ERROR: Invalid tag name 'a key with spaces' # while executing # "$doc createElement "a key with spaces" NONE" # invoked from within # "set node_String [$doc createElement "a key with spaces" NONE]" # $node_String appendChild [$doc createTextNode "please take care on setting: dom setNameCheck 0" STRING] $root appendChild $node_String # # -- aArray -- # set node_Array [$doc createElement "aArray" ARRAY] $node_Array appendChild [$doc createTextNode "a" STRING] $node_Array appendChild [$doc createTextNode "b" STRING] $node_Array appendChild [$doc createTextNode "c" STRING] $root appendChild $node_Array # # # -- aObject -- # set node_Object [$doc createElement "aObject" OBJECT] # set node__Label [$doc createElement "foo" NONE] set node__Value [$doc createTextNode "that" STRING] $node_Object appendChild $node__Label $node__Label appendChild $node__Value # set node__Label [$doc createElement "bar" NONE] set node__Value [$doc createTextNode "grill" STRING] $node_Object appendChild $node__Label $node__Label appendChild $node__Value # $root appendChild $node_Object # # # -- aObjectArray -- # set node_ObjArray [$doc createElement "aObjectArray"] # set node__Obj_01 [$doc createElement "obj0001"] # set node__Label [$doc createElement "foo"] set node__Value [$doc createTextNode "objArray_01_foo" STRING] $node__Label appendChild $node__Value $node__Obj_01 appendChild $node__Label set node__Label [$doc createElement "bar"] set node__Value [$doc createTextNode "objArray_01_bar" STRING] $node__Label appendChild $node__Value $node__Obj_01 appendChild $node__Label # set node__Array [$doc createElement "array" ARRAY] $node__Array appendChild [$doc createTextNode "five_01_a" STRING] $node__Array appendChild [$doc createTextNode "five_01_b" STRING] $node__Array appendChild [$doc createTextNode "five_01_c" STRING] # $node__Obj_01 appendChild $node__Array # # set node__Obj_02 [$doc createElement "obj0002"] # set node__Label [$doc createElement "foo"] set node__Value [$doc createTextNode "objArray_02_foo" STRING] $node__Label appendChild $node__Value $node__Obj_02 appendChild $node__Label set node__Label [$doc createElement "bar"] set node__Value [$doc createTextNode "objArray_02_bar" STRING] $node__Label appendChild $node__Value $node__Obj_02 appendChild $node__Label # set node__Array [$doc createElement "array" ARRAY] $node__Array appendChild [$doc createTextNode "five_02_a" STRING] $node__Array appendChild [$doc createTextNode "five_02_b" STRING] $node__Array appendChild [$doc createTextNode "five_02_c" STRING] # $node__Obj_02 appendChild $node__Array # $node_ObjArray appendChild $node__Obj_01 $node_ObjArray appendChild $node__Obj_02 # # $root appendChild $node_ObjArray # # in the case of mixed OBJECT and ARRAYs you have to update the specific rendering $node_ObjArray jsonType ARRAY $node__Obj_01 jsonType OBJECT $node__Obj_02 jsonType OBJECT # puts "== \$resultJSON ====" puts [$doc asXML -indent 4] puts "== \$resultJSON ====" puts [$doc asJSON -indent 4] # ====== ... output of this script: ====== tdom: 0.9.2 asXML: asJSON: {} == $resultJSON ==== 0.123 0.123 0.123 this is a String please take care on setting: dom setNameCheck 0 abc that grill objArray_01_foo objArray_01_bar five_01_afive_01_bfive_01_c objArray_02_foo objArray_02_bar five_02_afive_02_bfive_02_c == $resultJSON ==== { "aNumber": "0.123", "aNumberAsString": "0.123", "aNumberString": "0.123", "aString": "this is a String", "a key with spaces": "please take care on setting: dom setNameCheck 0", "aArray": [ "a", "b", "c" ], "aObject": { "foo": "that", "bar": "grill" }, "aObjectArray": [ { "foo": "objArray_01_foo", "bar": "objArray_01_bar", "array": [ "five_01_a", "five_01_b", "five_01_c" ] }, { "foo": "objArray_02_foo", "bar": "objArray_02_bar", "array": [ "five_02_a", "five_02_b", "five_02_c" ] } ] } ======