如何在Cakephp Rest中强制转换json动作

时间:2014-06-06 11:38:35

标签: json rest cakephp

我需要在cakephp rest响应中强制转换json动作。当我设置' _serialize'像这样

$this->set(array('message' => $lessons, '_serialize' => array('message')));

它有效,但是一些土耳其字符在unicode中查看,例如" \ u00e7al \ u0131 \ u015fma alan \ u0131"。

它的解决方案是使用json_encode($data, JSON_UNESCAPED_UNICODE)渲染数据,但是cakephp会自动渲染它。如何使用JSON_UNESCAPED_UNICODE强制json_encode?

抱歉英语不好。

3 个答案:

答案 0 :(得分:1)

JsonView不接受选项

json_encode()调用JsonView调用中无法注入选项,因为它在_serialize()方法中的硬编码无选择,如下所示:< / p>

protected function _serialize($serialize) {
    // ...

    if (version_compare(PHP_VERSION, '5.4.0', '>=') && Configure::read('debug')) {
        return json_encode($data, JSON_PRETTY_PRINT);
    }

    return json_encode($data);
}

使用自定义/扩展视图

因此,如果您想使用自动序列化,那么您必须创建自己的/扩展视图,以接受选项或硬编码您想要的选项。

这是一个带有硬编码选项的(未经测试的)示例。 _serialize()方法基本上只是添加了JSON_UNESCAPED_UNICODE选项的副本:

App::uses('JsonView', 'View');

class MyJsonView extends JsonView {
    protected function _serialize($serialize) {
        if (is_array($serialize)) {
            $data = array();
            foreach ($serialize as $alias => $key) {
                if (is_numeric($alias)) {
                    $alias = $key;
                }
                if (array_key_exists($key, $this->viewVars)) {
                    $data[$alias] = $this->viewVars[$key];
                }
            }
            $data = !empty($data) ? $data : null;
        } else {
            $data = isset($this->viewVars[$serialize]) ? $this->viewVars[$serialize] : null;
        }

        if (version_compare(PHP_VERSION, '5.4.0', '>=') && Configure::read('debug')) {
            return json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
        }

        return json_encode($data, JSON_UNESCAPED_UNICODE);
    }
}

另请参阅 http://book.cakephp.org/2.0/en/views.html#creating-your-own-view-classes

答案 1 :(得分:1)

我自己没有测试过,所以它只是从我的头脑中开始。

您可以编写自己的View类,扩展JsonView并覆盖_serialize方法。 https://github.com/cakephp/cakephp/blob/4e8e266754a25748f481b2f567e45f767808be53/lib/Cake/View/JsonView.php#L131

<?php
App::uses('JsonView', 'View');

class MyCustomView extends JsonView {

    protected function _serialize($serialize) {
        if (is_array($serialize)) {
            $data = array();
            foreach ($serialize as $alias => $key) {
                if (is_numeric($alias)) {
                    $alias = $key;
                }
                if (array_key_exists($key, $this->viewVars)) {
                    $data[$alias] = $this->viewVars[$key];
                }
            }
            $data = !empty($data) ? $data : null;
        } else {
            $data = isset($this->viewVars[$serialize]) ? $this->viewVars[$serialize] : null;
        }

        return json_encode($data, JSON_UNESCAPED_UNICODE);
    }
}

然后在您的控制器中执行类似

的操作
<?php

App::uses('MyCustomView', 'View');

class SomeController extends AppController {

    public function someMethod() {
        $this->viewClass = 'MyCustomView';

        // What ever you normally do
    }
}

答案 2 :(得分:1)

在CakePHP 3中你可以在控制器中说:

gst_ios_init.m

将覆盖使用的选项。