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('"', """, $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(/"/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->Some_model->get_some_data()
返回一个类型化的FALSE
或NULL
,如果不存在结果,则可以使用相等运算符进行验证,您可以安全地将其表达到视图中的 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,因为它具有 或引号之类的字符(我遇到未捕获的异常)。我已经更新了问题以反映它。 @user898836var my_json = <?php echo $data['somedata'];?>; 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