本站已关停,现有内容仅作科研等非赢利用途使用。特此声明。
查看: 3589|回复: 0
打印 上一主题 下一主题

ZEND FRAMEWORK2从action返回json时中文编码处理

[复制链接]
跳转到指定楼层
1#
发表于 2013-12-3 10:46:23 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
本帖最后由 youjingqiang 于 2013-12-3 10:48 编辑

1.配置/config/module.config.php:
  1.     'view_manager' => array(
  2.         'template_path_stack' => array(
  3.             'album' => __DIR__ . '/../view',
  4.         ),
  5.         'strategies' => array(
  6.                         'ViewJsonStrategy',
  7.         ),
  8.     ),
复制代码
加入strategies配置。
2.配置action
  1.     public function indexAction()
  2.     {
  3.         //return new ViewModel(array(
  4.           //  'albums' => $this->getAlbumTable()->fetchAll(),
  5.         //));
  6.         $results = array();
  7.         $roots = array();
  8.         $albums = $this->getAlbumTable()->fetchAll();
  9.         foreach ($albums as $album){
  10.                 $roots[] = array($album->id,$album->title,$album->artist);
  11.         }
  12.         $results = @array('success'=>'true','root' => $roots);
  13.         $results = new JsonModel($results);
  14.         return $results;
  15.     }
复制代码
3.修改vendor\zendframework\zendframework\library\Zend\Json\Json.php
    先在Json类中添加一个静态方法:
  1.    public static function json_prev($elem) {
  2.            if (is_array($elem)) {
  3.                    foreach ($elem as $k => $v) {
  4.                            $na[Json::json_prev($k)] = Json::json_prev($v);
  5.                    }
  6.                    return $na;
  7.            }
  8.            return urlencode($elem);
  9.    }
复制代码
然后修改encode方法:
  1. public static function encode($valueToEncode, $cycleCheck = false, $options = array())
  2.     {
  3.      $valueToEncode = Json::json_prev($valueToEncode);//第一处修改位置
  4.         if (is_object($valueToEncode)) {
  5.             if (method_exists($valueToEncode, 'toJson')) {
  6.                 return $valueToEncode->toJson();
  7.             } elseif (method_exists($valueToEncode, 'toArray')) {
  8.                 return static::encode($valueToEncode->toArray(), $cycleCheck, $options);
  9.             }
  10.         }

  11.         // Pre-encoding look for Zend_Json_Expr objects and replacing by tmp ids
  12.         $javascriptExpressions = array();
  13.         if (isset($options['enableJsonExprFinder'])
  14.            && ($options['enableJsonExprFinder'] == true)
  15.         ) {
  16.             $valueToEncode = static::_recursiveJsonExprFinder($valueToEncode, $javascriptExpressions);
  17.         }

  18.         // Encoding
  19.         if (function_exists('json_encode') && static::$useBuiltinEncoderDecoder !== true) {
  20.             $encodedResult = json_encode(
  21.                 $valueToEncode,
  22.                 JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP
  23.             );
  24.         } else {
  25.             $encodedResult = Encoder::encode($valueToEncode, $cycleCheck, $options);
  26.         }

  27.         //only do post-processing to revert back the Zend_Json_Expr if any.
  28.         if (count($javascriptExpressions) > 0) {
  29.             $count = count($javascriptExpressions);
  30.             for ($i = 0; $i < $count; $i++) {
  31.                 $magicKey = $javascriptExpressions[$i]['magicKey'];
  32.                 $value    = $javascriptExpressions[$i]['value'];

  33.                 $encodedResult = str_replace(
  34.                     //instead of replacing "key:magicKey", we replace directly magicKey by value because "key" never changes.
  35.                     '"' . $magicKey . '"',
  36.                     $value,
  37.                     $encodedResult
  38.                 );
  39.             }
  40.         }

  41. return urldecode($encodedResult);//第二处修改位置
  42.     }
复制代码
现在,访问你的action,就可以看到json格式的返回值了

无标题.png (25.18 KB, 下载次数: 10)

返回结果

返回结果
ChinaGDG.com
回复

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表