jsonEncode ends up using Zend_Json_Encoder
here you will find a function _encodeValue
which will either return an array or a object depending on the type of value.
protected function _encodeValue(&$value)
{
if (is_object($value)) {
return $this->_encodeObject($value);
} else if (is_array($value)) {
return $this->_encodeArray($value);
}
return $this->_encodeDatum($value);
}
So if there is a object passed in then there will be an object returned. This really helps with multiple levels. For example.
Mage::helper('core')->jsonEncode(array('test', 'blah')); => ["test","blah"]
Mage::helper('core')->jsonEncode((object) array('test', 'blah')); => {"0":"test","1":"blah"}
Mage::helper('core')->jsonEncode(array('test', (object) 'blah')); => ["test",{"scalar":"blah"}]
Note that there are some special cases when encoding objects. As explained on the zend docs
Encoding PHP objects If you are encoding PHP objects by default the
encoding mechanism can only access public properties of these objects.
When a method toJson() is implemented on an object to encode,
Zend\Json\Json calls this method and expects the object to return a
JSON representation of its internal state.
Zend\Json\Json can encode PHP objects recursively but does not do so
by default. This can be enabled by passing true as a second argument
to Zend\Json\Json::encode().
// Encode PHP object recursively $jsonObject =
Zend\Json\Json::encode($data, true); When doing recursive encoding of
objects, as JSON does not support cycles, an
Zend\Json\Exception\RecursionException will be thrown. If you wish,
you can silence these exceptions by passing the
silenceCyclicalExceptions option: