Принудительное кодирование JSON для возврата объекта
Насколько я понимаю, в Magento есть функция кодирования JSON с использованием zend framework. И мой вопрос, есть ли возможность заставить эту функцию всегда возвращать объект JSON, а не массив JSON?
Mage::helper('core')->jsonEncode($array);
В родном PHP (версия 5.3.0 или выше) я могу добиться этого, передав эту константу "JSON_FORCE_OBJECT" во второй параметр функции json_encode(). Любая помощь будет очень признательна.
2 answers
JSONENCODE заканчивается использованием Zend_Json_Encoder
здесь вы найдете функцию _encodeValue
, которая либо вернет массив, либо объект в зависимости от типа значения.
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);
}
Таким образом, если есть переданный объект, то будет возвращен объект. Это действительно помогает на нескольких уровнях. Например.
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"}]
Обратите внимание, что при кодировании объектов существуют некоторые особые случаи. Как описано в документах zend
Кодирование объектов PHP, если вы кодируете объекты PHP с помощью по умолчанию механизм кодирования может получить доступ только к общедоступным свойствам этих объектов. Когда метод toJSON() реализуется на объекте для кодирования, Zend\Json\Json вызывает этот метод и ожидает, что объект вернет Представление JSON его внутреннего состояния.
Zend\Json\Json может рекурсивно кодировать объекты PHP, но по умолчанию этого не делает. Это можно включить, передав значение true в качестве второго аргумента Zend\Json\Json::encode().
//Рекурсивно кодировать объект PHP $jsonобъект= Zend\Json\Json::кодировать($data, true); При рекурсивном кодировании объектов, поскольку JSON не поддерживает циклы, будет создано исключение Zend\Json\Exception\recursionexception. При желании вы можете отключить эти исключения, передав опцию silenceCyclicalExceptions:
Еще один метод, который я нашел и сработал как заклинание.
$this->getResponse()->clearHeaders()->setHeader('content-type', 'application/json', true);
$this->getResponse()->setBody(json_encode($array));