&|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"
]
}
]
}
======