【问题标题】:Get response in JSON format in Yii2在 Yii2 中获取 JSON 格式的响应
【发布时间】:2017-01-16 11:10:31
【问题描述】:

我正在尝试将响应数组转换为 JSON 格式。我已经尝试了发布在 SO 和其他网站上的所有答案,例如 web1,web2 添加 header('Content-Type: application/json') 然后 echo json_encode($data,JSON_PRETTY_PRINT); 但我总是得到文本格式的输出。 谁能帮我解决这个问题。

助手类:

public static function renderJSON($data) {
    header('Content-Type: application/json');
    echo json_encode($data,JSON_PRETTY_PRINT);
}

我的控制器:

if ($model->login()) {
    $user =  User::findByUsernameOrEmail($request->post('username'));
    $userArray = ArrayHelper::toArray($user);
    Helpers::renderJSON($userArray);

我尝试打印userArray,它看起来像这样:

Array
(
    [name] => abc
    [lastname] => xyz
    [username] => test_test
)

Json 输出:(html/text)

{
    "name": "abc",
    "lastname": "xyz",
    "username": "test_test"
}

【问题讨论】:

    标签: php json yii2 yii2-advanced-app


    【解决方案1】:

    设置

    \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
    

    return之前某处的控制器动作中。

    【讨论】:

    • 谢谢比兹利。它正在工作。我可以在echo 语句之前的helper class 中添加它吗,因为我将在不同的地方调用该函数。
    • 首先你应该return数据而不是echo它。只要它影响当前响应,它就可以在任何地方。
    • 好的,比兹利。我会将其更改为 return 而不是 echo (但将其更改为 return 会给我空结果。我正在检查 postman 上的代码并且输出中没有任何内容)。我在控制器的behaviors()方法中添加了语句
    • 通过添加\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;你不需要使用任何Helper类,甚至$userArray = ArrayHelper::toArray($user);,只需尝试返回$user
    • @ASN 在下面看到我的回答
    【解决方案2】:

    从 Yii 2.0.11 开始,有一个专用的asJson() 方法可以返回 JSON 格式的响应。运行:

    return $this->asJson($array);
    

    在您的控制器操作中。

    【讨论】:

    • 如果返回一大块 HTML,它的运行速度真的很慢,不知道为什么
    • 尝试完全禁用调试,看看是否会缩短加载时间。我有几个 Yii2 项目存在加载时间问题,并且逐步禁用模块/组件我发现是 Yii2-debug 组件减慢了整个应用程序服务器端的速度。
    【解决方案3】:

    只需在控制器中添加这个

    public function beforeAction($action)
    {
    
        \Yii::$app->response->format = Response::FORMAT_JSON;
        return parent::beforeAction($action);
    }
    

    【讨论】:

    • thx,除了基础应用之外,还有一些 api 控制器的应用的最佳解决方案
    【解决方案4】:
    use yii\helpers\Json;
    use yii\web\Response;
    

    首先在您的控制器顶部包含上面的 2 行,然后在您的任何控制器操作中,就在 return 语句之前,包含以下内容

    Yii::$app->response->format = Response::FORMAT_JSON;
    return Json::encode([
                'message' => 'success'
    ]);
    

    您可以构建您认为合适的返回数组。

    【讨论】:

    • 这返回了"{\"message\":\"success\"}" 作为字符串而不是对象!
    • 你可以使用这个:json_encode($your_array,JSON_UNESCAPED_SLASHES)
    • Json::encode - 是多余的,FORMAT_JSON 也一样
    【解决方案5】:
    use JsonException;
    use yii\web\NotFoundHttpException;
    use yii\base\InvalidConfigException;
    use yii\web\Response;
    use yii\web\JsonResponseFormatter;
    
    
    /**
     * @param int $id
     * @return string[]
     * @throws InvalidConfigException
     * @throws JsonException
     * @throws NotFoundHttpException
     */
    public function actionViewJson(): array
    {
        Yii::$app->response->format = Response::FORMAT_JSON;
        Yii::$app->response->formatters = [
            Response::FORMAT_JSON => [
                'class' => JsonResponseFormatter::class,
                'prettyPrint' => true
            ]
        ];
        
        return ['key' => 'val'];
    }       
    

    【讨论】:

      猜你喜欢
      • 2015-12-02
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 2019-04-09
      • 1970-01-01
      • 1970-01-01
      • 2018-03-13
      相关资源
      最近更新 更多