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:
Below are the custom api module with key pair value
To get JSON response, in client set Response headers to "Content-Type: application/json; charset=utf-8"
and if you need key pair value that is in response should have key and value as like /rest/V1/categories
we need to create data interface
To test in Chrome download plugin called rest client app call the url
below module url will be http://yourdomein.com/magento2/rest/V1/getinfo
app\code\Sugarcode\Customapi\registration.php:
<?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Sugarcode_Customapi',
__DIR__
);
app\code\Sugarcode\Customapi\etc\module.xml:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
<module name="Sugarcode_Customapi" setup_version="2.0.0"/>
</config>
app\code\Sugarcode\Customapi\etc\di.xml:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
<preference for="Sugarcode\Customapi\Api\TestInterface"
type="Sugarcode\Customapi\Model\Test" />
<preference for="Sugarcode\Customapi\Api\Data\TestdataInterface" type="Sugarcode\Customapi\Model\Testmodel" />
</config>
app\code\Sugarcode\Customapi\etc\webapi.xml:
<?xml version="1.0"?>
<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../app/code/Magento/Webapi/etc/webapi.xsd">
<!-- Example: curl http://127.0.0.1/index.php/rest/V1/calculator/add/1/2 -->
<route url="/V1/getinfo" method="GET">
<service class="Sugarcode\Customapi\Api\TestInterface" method="getinfo" />
<resources>
<resource ref="anonymous" />
</resources>
</route>
</routes>
app\code\Sugarcode\Customapi\Api\TestInterface.php:
<?php
namespace Sugarcode\Customapi\Api;
use Sugarcode\Customapi\Api\Data\TestdataInterface;
interface TestInterface
{
/**
* Retrieve list of info
*
* @throws \Magento\Framework\Exception\NoSuchEntityException If ID is not found
* @return \Sugarcode\Customapi\Api\Data\TestdataInterface containing Tree objects
*/
public function getinfo();
}
don't remove comments its most important
app\code\Sugarcode\Customapi\Api\Data\TestdataInterface.php (set and get data):
<?php
namespace Sugarcode\Customapi\Api\Data;
/**
* @api
*/
interface TestdataInterface
{
/**
* Get name
*
* @return string
*/
public function getName();
/**
* Set name
*
* @param string $name
* @return $this
*/
public function setName($id);
}
app\code\Sugarcode\Customapi\Model\Test.php:
<?php
namespace Sugarcode\Customapi\Model;
use Sugarcode\Customapi\Api\TestInterface;
/**
* Defines the implementaiton class of the calculator service contract.
*/
class Test implements TestInterface
{
/**
* Return the sum of the two numbers.
*
* @api
* @param int $num1 Left hand operand.
* @param int $num2 Right hand operand.
* @return int The sum of the two values.
*/
protected $dataFactory;
public function __construct(\Sugarcode\Customapi\Api\Data\TestdataInterfaceFactory $dataFactory)
{
$this->dataFactory = $dataFactory;
}
public function getinfo() {
$page_object = $this->dataFactory->create();
$page_object->setName('Hello');
return $page_object;
}
}
app\code\Sugarcode\Customapi\Model\Testmodel.php:
<?php
namespace Sugarcode\Customapi\Model;
class Testmodel extends \Magento\Framework\Model\AbstractModel implements
\Sugarcode\Customapi\Api\Data\TestdataInterface
{
const KEY_NAME = 'name';
public function __construct(
\Magento\Framework\Model\Context $context,
\Magento\Framework\Registry $registry,
\Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
\Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
array $data = []
) {
parent::__construct($context, $registry, $resource, $resourceCollection, $data);
}
public function getName()
{
return $this->_getData(self::KEY_NAME);
}
/**
* Set name
*
* @param string $name
* @return $this
*/
public function setName($name)
{
return $this->setData(self::KEY_NAME, $name);
}
}
Best Answer
Look how Magento 2 handles api response..
Magento 2 accept array type to response.
or just..