What "objects" are supported natively when sending data to the companion app?

I am sending data to a companion Android app but am running into an issue where the data sent does not match the data received. 

I have set up the app to register for phone messages and create a ConnectionListener which is then used when calling transmit() as such:

Communications.registerForPhoneAppMessages(method(:onPhoneMessage));

var connectionListener = new ConnectionListener();
Communications.transmit(dataList[0], {}, connectionListener);

The dataList[] variable is an array of Dictionary (hash table) objects containing various data points, in a nested format, similar to this:

{
"timestamp" => 1559166067,
"app_running" => false,
"data" => {
"altitude" => -17.998905,
"speed" => 0.000000,
"temperature" => null,
"watch" => {
"charging" => false,
"battery" => 50.000000
},
"position => {
"lon" => -118.49,
"lat" => 34.01,
"quality" => 4
}
},
"remarks" => "What is going on with this BLE connection?"
}

The problem is that nesting of this hash table seems to get mixed up somewhere after it is passed to the transmit() method, with various nested elements moved to other parents as such (note the bolded elements):

{
"timestamp" => 1559166067,
"app_running" => false,
"data" => {
"speed" => 0.000000,
"temperature" => null,
"watch" => {
"altitude" => -17.998905,
"lat" => 34.01
},
"position => {
"lon" => -118.49,
"quality" => 4,
"charging" => false,
"battery" => 50.000000
}
},
"remarks" => "What is going on with this BLE connection?"
}

Does the transmit() method call the toString() method on the object that is passed or is it set up to handle certain objects natively? The API docs don't really give all that much information on what type of "object" can or can't be used.