我需要在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? p>
抱歉英语不好。
答案 0 :(得分:1)
在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)
gst_ios_init.m
将覆盖使用的选项。