Version 10 of build JSON with tdom

Updated 2022-07-03 16:06:09 by rattleCAD
Whatbuild JSON with tdom
Requirestdom 0.9.2
tagstdom
referencehttp://www.tdom.org/index.html/doc/trunk/doc/index.html
Updated30.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 ====
<aNumber>0.123</aNumber>
<aNumberAsString>0.123</aNumberAsString>
<aNumberString>0.123</aNumberString>
<aString>this is a String</aString>
<a key with spaces>please take care on setting: dom setNameCheck 0</a key with spaces>
<aArray>abc</aArray>
<aObject>
    <foo>that</foo>
    <bar>grill</bar>
</aObject>
<aObjectArray>
    <obj0001>
        <foo>objArray_01_foo</foo>
        <bar>objArray_01_bar</bar>
        <array>five_01_afive_01_bfive_01_c</array>
    </obj0001>
    <obj0002>
        <foo>objArray_02_foo</foo>
        <bar>objArray_02_bar</bar>
        <array>five_02_afive_02_bfive_02_c</array>
    </obj0002>
</aObjectArray>

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