Принудительное кодирование JSON для возврата объекта


Насколько я понимаю, в Magento есть функция кодирования JSON с использованием zend framework. И мой вопрос, есть ли возможность заставить эту функцию всегда возвращать объект JSON, а не массив JSON?

Mage::helper('core')->jsonEncode($array);

В родном PHP (версия 5.3.0 или выше) я могу добиться этого, передав эту константу "JSON_FORCE_OBJECT" во второй параметр функции json_encode(). Любая помощь будет очень признательна.

 2
Author: Leongelis, 2014-04-03

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:

 2
Author: David Manners, 2014-04-03 19:19:45

Еще один метод, который я нашел и сработал как заклинание.

$this->getResponse()->clearHeaders()->setHeader('content-type', 'application/json', true);
$this->getResponse()->setBody(json_encode($array));
 2
Author: Magarusu, 2014-09-19 07:54:41