How to access children


Children

As mentioned in the introduction, each cJobject is either a key/value pair or is the parent of some more cJobjects. Accessing the children of a cJobject is straightforward, and as close to the JavaScript as possible within the confines and rules of the VBA language syntax.

By key , for example 

job.child("somekey")

or by childIndex

job.children(1)

This is roughly equivalent to job.somekey or job[0] in JavaScript except that cjobject has a childIndex for both array members and regular objects (JavaScript only has indices for Arrays), and the cJobject index starts at 1 (JavaScript starts at 0)

Grandchildren

You can access grandchildren and so on in a couple of ways too

job.child("achild").child("agrandchild").child("agreatgrandchild")

is equivalent to

job.child("achild.agrandchild.agreatgrandchild")

which is close to the JavaScript job.achild.agrandchild.agreatgrandchild

You can also mix index and named keys, so 

job.children(1).child("name") is equivalent to job.child("1.name") and the JavaScript equivalent job[0].name


Arrays

As mentioned arrays are not really much different to regular objects, except that their key is the same value as their childIndex. 

Using the test data from cJobject deep dive here's an example of extracting and stringifying the the first array member
    Set child = job.children(1)
    Debug.Print child.stringify

{"name":"john","age":25}

We can print the value of the name property of the first array member
    Debug.Print job.children(1).child("name").value

john

Which is equivalent to this
Debug.Print job.child("1.name").value

john

Note that we can always stringify (convert to JSON) any cJobject - even a single property
    Debug.Print job.child("1.name").stringify

{"name":"john"}

How many children

You can test if a cJobect has children like this
if (job.hasChildren) then ...

The number of children is
job.children.count

job.hasChildren is equivalent to job.children.count > 0. In JavaScript you could only do this test ( if (job.length > 0) )  on an Array. For an object you would need to say ...  if (Object.keys(job).length > 0)

Testing if a child exists

Accessing a child that doesn't exist will return Nothing, so you can simply test any of the syntax already mentioned for Nothing.
if (not job.child("2.age") is nothing) then ...

for convenience, I provide an isSomething()  function also, so the above is equivalent to
if (isSomething (job.child("2.age") ) ) then ...

This is roughly equivalent to the JavaScript if(typeof job[1].age === typeof undefined) { ... , except that JavaScript will throw an error if job is not an Array,  or element 1 does not exist, only making a successful test on the final property - age. cJobject will not fail, but return Nothing.

Now let's look at some more cJobject topics.


For help and more information join our communityfollow the blog or follow me on twitter .  For more on this see How to use cJobject

Comments