Json Types

Standard Data Types

The primitive data types of all tree nodes are derived from the JSON standard, together with a few small extensions. JSON defines the following types:

  • Null This is a special type consisting only of the value null. It is used for uninitialized or inexistent elements.

  • Boolean This type is for boolean values, valid elements are true and false.

  • Number This type is for numbers. This type does not distinguish between floating point numbers and integers. Possible values are for example 4, 123, 1.23e2 or -12.3. NxLib functions for reading integers effectively return the rounded value if it is not integer.

  • String Contains a sequence of characters. Special characters need to be escaped properly. Possible values are for examples *”Hello World!”*, “This\nis\nline three.” or “Nested \”quotes\” look like that.”. Please refer to www.json.org for escaping rules.

  • Array An array contains other elements of arbitrary JSON types. It is especially important to note that every element can have a different type. Array elements in NxLib are accessed via their integer index, starting at zero. Arrays are surrounded by square brackets, values are separated by a comma. Example values are [1, 2, 3] or [1, 2.4, “Hello”, [“a”,”b”]].

  • Object An object also contains subelements, but in contrast to arrays each element is identified by a string instead of an index. Objects are surounded by curly braces and consist of key:value pairs, separated by commas. Examples are {“name”:{“family”:”Duesentrieb”,”given”:”Daniel”}, “age”:45,”profession”:”inventor”} or {“weather”:”good”, “points”:[[1,2], [0,4], [-4,7]]}.

If you have never seen JSON, we encourage you to take a quick look at some examples on one of these pages:

Proprietary Extensions

There are currently two extensions to these types:

  • Link is a node of type String, but an internal flag on the node indicates that it’s string content is a path to another item. The library then transparently makes the content of the node it refers to available at this node. This technique is used to make cameras available under their EEPROM ID, by linking to the node of the corresponding camera serial number.

  • Binary nodes are used to publish images or point clouds. A binary blob is a node of the basic type Number, to which a memory block is associated. The nodes number value corresponds to it’s revision in form of a time stamp. Special accessor functions allow to query the exact size and format of the memory block and get a copy of it’s content written to a user specified memory location.

Note

Binary node timestamps indicate the number seconds elapsed since January 1st, 1601 (UTC). The example below illustrates how to convert a time stamp into a SYSTEMTIME struct on Windows.

Conversion of Binary node time stamps

double timestamp;
nxLibGetBinaryInfo(..., &timestamp);
__int64 fileTimeAsInt = (__int64) (timestamp*1e7); // Convert seconds to 1/10 microseconds
FILETIME fileTime;
fileTime.dwLowDateTime = (unsigned int) fileTimeAsInt; // write int64 into low and high part of FILETIME struct
fileTime.dwHighDateTime = (unsigned int) (fileTimeAsInt >> 32);
SYSTEMTIME utcTime;
if (FileTimeToSystemTime(&fileTime, &utcTime)) {
    printf("Time stamp is %d-%d-%d %02d:%02d:%02d.%03d", utcTime.wYear, utcTime.wMonth, utcTime.wDay, utcTime.wHour, utcTime.wMinute, utcTime.wSecond, utcTime.wMilliseconds);
}

Note

On Linux operating systems, timestamps usually refer to January 1st, 1970 UTC. The offset between the two representations is fixed to 11644473600.0 seconds.