如何在Yii2中创建关联数组并转换为JSON?

时间:2015-11-26 02:21:12

标签: json yii2

我在项目中使用日历,我希望将Event模型中的数据传递到以JSON格式查看文件。我试过跟随,但它不起作用,无法正确显示数据

$events = Event::find()->where(1)->all();

$data = [];

foreach ($events AS $model){
    //Testing
    $data['title'] = $time->title;
    $data['date'] = $model->start_date;
    $data['description'] = $time->description;
}

\Yii::$app->response->format = 'json';
echo \yii\helpers\Json::encode($data);

但它只返回$data数组中的一个模型,最终数据应采用以下格式:

[
    {"date": "2013-03-19 17:30:00", "type": "meeting", "title": "Test Last Year" },
    { "date": "2013-03-23 17:30:00", "type": "meeting", "title": "Test Next Year" }
]

2 个答案:

答案 0 :(得分:4)

当你这样写:

\Yii::$app->response->format = 'json';

在渲染数据之前,不需要进行任何额外的操作来将数组转换为JSON。

您只需要return(而不是echo)数组:

return $data;

数组将自动转换为JSON。

最好使用yii\web\Response::FORMAT_JSON常量而不是硬编码字符串。

另一种处理方式是使用ContentNegotiator过滤器,它有更多选项,允许设置多个动作等。控制器示例:

use yii\web\Response;

...

/**
 * @inheritdoc
 */
public function behaviors()
{
    return [
        [
            'class' => 'yii\filters\ContentNegotiator',
            'only' => ['view', 'index'],  // in a controller
            // if in a module, use the following IDs for user actions
            // 'only' => ['user/view', 'user/index']
            'formats' => [
                'application/json' => Response::FORMAT_JSON,
            ],                
        ],
    ];
}

它也可以配置为整个应用程序。

更新:如果您在控制器之外使用它,请不要设置响应格式。使用Json助手和encode()方法就足够了。但是你的代码中也有一个错误,你应该像这样创建一个新的数组元素:

$data = [];
foreach ($events as $model) {
    $data[] = [
        'title' => $time->title,
        'date' => $model->start_date,
        'description' => $time->description,
    ];
}

答案 1 :(得分:2)

您可以尝试这样:

$events = Event::find()->select('title,date,description')->where(1)->all()
yii::$app->response->format = yii\web\Response::FORMAT_JSON; // Change response format on the fly

return $events; // return events it will automatically be converted in JSON because of the response format.

顺便说一下,你应该在$data循环中覆盖foreach变量:

$data = [];
foreach ($events AS $model){
    //Make a multidimensional array
    $data[] = ['time' => $time->title,'date' => $model->start_date,'description' => $time->description];
}
echo \yii\helpers\Json::encode($data);