Codeigniter - 如何将 JSON 作为参数传递给视图 [重复]

Posted

技术标签:

【中文标题】Codeigniter - 如何将 JSON 作为参数传递给视图 [重复]【英文标题】:Codeigniter - how to pass JSON as a parameter to the view [duplicate] 【发布时间】:2012-11-22 19:41:09 【问题描述】:

我正在构建一个 codeigniter/php web 应用程序。 我试图在加载视图时将 JSON 对象从控制器传递到视图,以使 javascript 可以访问它。

JSON 如下所示:


    "event": 
        "id": "1",
        "name": "Some name",
        "description": "Some description",
        "address": "1 Main st."
    ,
    "members": 
        "others": [
            
                "id": "26",
                "name": "Brad Black"
            ,
            
                "id": "27",
                "name": "Bill Blue"
            
        ],
        "current": 
            "id": "1",
            "name": "Jill White"
        
    

控制器代码如下所示:

public function index()

    $some_data = $this->Some_model->get_some_data();

    $some_data = json_encode($some_data);

    $data = array (
            'some_data' => $some_data
    );

    $this->load->view('some_view',$data);

视图 (some_view) 代码如下所示:

<script src="path/to/scripts/some_script.js" type="text/javascript"></script>

<script type="text/javascript">

    some_data = "<?php echo $some_data?>";

</script>

<div class="main">
</div>

javascript (some_script) 代码如下所示:

var some_data;

$(document).ready(function()

    some_data = $.parseJSON(some_data);
);

挑战在于,由于 JSON 对象是作为字符串发送的(在 json_encode 之后),因此它具有诸如 和引号之类的字符作为其中的一部分,当我将其分配给 var (some_data = "";)。我也尝试过使用,但效果不佳。

我尝试做了一堆不起作用的事情,为了取得进展,我暂时最终更换了控制器中的“ $data['some_data'] = str_replace('"', """, $some_data);

public function index()

    $some_data = $this->Some_model->get_some_data();

    $some_data = json_encode($some_data);

    $data = array (
            'some_data' => str_replace('"', "&quot;", $some_data);
    );

    $this->load->view('some_view',$data);

并替换 javascript 中的“返回到” some_data = some_data.replace(/"/g, '"');

var some_data;

$(document).ready(function()

    event_data = event_data.replace(/&quot;/g, '"');
    some_data = $.parseJSON(some_data);
);

这有点难看,我正在寻找更好的解决方案。

任何指针将不胜感激。

更新! 问题已解决,看起来多余的引号会破坏事情。

解决方案与 mohan.gade 的回答一致:

控制器:

public function index()

    $some_data = $this->Some_model->get_some_data();

    $some_data = json_encode($some_data);

    $data = array (
            'some_data' => $some_data;
    );

    $this->load->view('some_view',$data);

查看:

    some_data = <?php echo $some_data?>;

</script>

【问题讨论】:

【参考方案1】:

您的 JSON 值未传递到视图,请尝试更正以下代码。

public function index()

    $some_data = $this->Some_model->get_some_data();
    $some_data = json_encode($some_data);
    $data = array (
            'some_data' => $some_data
    );
        $this->load->view('some_view',$data);





//in view file 
   <script type="text/javascript">
     var jsonData = <?php echo $some_data; ?>
   </script>

【讨论】:

谢谢莫汉,我实际上是按照你建议的顺序做的,当我写问题时,我以错误的顺序剪切和粘贴行。 JSON创建正确,我的问题是如何将它分配给客户端(视图/javascript)的javascript var。我已经更新了问题以反映它。 您的代码运行良好!看起来我(出于某种原因)在 标签周围有一个额外的引号......将您的答案标记为正确的【参考方案2】:

只要您的模型有一定的理智,这无需大量代码即可安全地完成。你发布的 JSON 让我相信你有一个包含事件的数据库,而一个事件要么存在,要么不存在。

如果$this-&gt;Some_model-&gt;get_some_data() 返回一个类型化的FALSENULL,如果不存在结果,则可以使用相等运算符进行验证,您可以安全地将其表达到视图中的 JS,就像您可以传达JSON。

例如:

$some_data = $this->Some_model->get_some_data();
if ($some_data === NULL) 
     $data['somedata'] = 'null';
 else 
     // We trust our model, pass it along.
     $data['somedata'] = json_encode($some_data);

$this->load->view('some_view', $data);

然后,在您的 JS 中,简单地验证包含原始 JSON 字符串的变量在对其进行操作之前实际上不为空。也可以只设置为整数,重点是便于区分。

从外观上看,如果事件确实存在,您至少将拥有事件数据和创建它的人作为成员。您可能需要做更多的健全性检查,我不确定您的模型中有什么。

只需确保 PHP 变量在您的 JS 中以语法正确的方式展开,或者如果没有数据可以选择完全更改 JS。

【讨论】:

谢谢蒂姆,我确实在处理事件。 JSON 永远不会像您所怀疑的那样为 NULL 或空。 JSON 在控制器端没问题。我的挑战是如何将它分配给客户端(视图/javascript)的 javascript var,因为它具有 或引号之类的字符(我遇到未捕获的异常)。我已经更新了问题以反映它。 @user898836 var my_json = &lt;?php echo $data['somedata'];?&gt;; some_data = $.parseJSON(my_json); 不工作? 它稍作修改, 必须是 我不需要使用 parseJSON .再次感谢!【参考方案3】:

json_encode 如果传递了空变量,将返回null,因此您无需在查看代码时转义"。相反,您必须检查变量是数组还是要传入的对象以生成不同的代码。

以你为例:

if( is_array( $_var_value ) || is_object( $_var_value) )
    echo 'var ' . $_var_name . ' = ' . json_encode( $_var_value ) . ";";
else // if( is_string( $_var_value ) )
    echo 'var ' . $_var_name . ' = "' .  $_var_value  . '";';

为你的情况更新

 <script type="text/javascript">
     <?php if( is_array( $_var_value ) || is_object( $_var_value) ) ?>
     var some_data = <?php echo json_encode($some_data); ?>;
     <?php else ?>
     var some_data = "<?php echo $some_data; ?>";
     <?php  ?>
 </script>

【讨论】:

感谢 Cauliture。您是否建议我应该在 中使用您的代码,而不是我的 不,它在视图文件中可能很难看,但我认为它易于阅读和维护,并且在 javascript 上也很好处理。 isIterable 条件不是必需的。 ***.com/a/57439636/2943403

以上是关于Codeigniter - 如何将 JSON 作为参数传递给视图 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

无法在Codeigniter页面上显示Morris.JS图表,使用JSON数据作为图表的输入

AngularJS |如何将 Json 的数据发送到 Codeigniter 中的数据库

CodeIgniter - 如何从控制器返回 Json 响应

我如何在控制器函数中加载目录作为视图:Codeigniter

如何使用 JQuery 将 HTML 表单字段作为数组直接传递到 CodeIgniter 中的数据库

将 JSON 发布到 Codeigniter 控制器