【问题标题】:why JavaScript is not displaying parsed json data?为什么 JavaScript 不显示解析的 json 数据?
【发布时间】:2010-10-31 21:53:49
【问题描述】:

这是我通过 getjson 从服务器收到的 JSON 数据格式:[{"options":"smart_exp"},{"options":"user_int"},{"options":"blahblah"}]。我需要在用户输入中附加 json。我正在尝试以这种方式进行操作:首先将其转换为 javascript 对象,将其附加到用户输入中,再次转换为 json 对象并将其发送回服务器以进行数据库更新。我已经使用 eval() 将 json 转换为 javaScript 对象。现在无法操作 javascript 对象。如果我将 javascript 对象转换回 json 对象,它会正确显示从服务器发送的所有数据。

 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
 "http://www.w3.org/TR/html4/strict.dtd">
 <html><head></head>
 <body> 
 <form name="index">
 <p><input type = "text" id = "txt" name = "txt"></input></p>
 <p><input type = "button" id = "send" name = "send" value = "send" 
 onClick="ADDLISTITEM();"></input></p>
 <select name="user_spec" id="user_spec" />
 </form>
 <script>
 function ADDLISTITEM()
 {// this script suffers from errors on eval/JSON.parse methods
 alert (json.length);//outputs corrcet with eval 
 tring = JSON.stringify(json);//outputs corrcet with eval
 alert(jsonString);//outputs corrcet with eval
 alert(json.options[0]);//no output
 }
 </script>
 <script src="http://code.jquery.com/jquery-latest.min.js">    
 </script>
 <script src="http://www.json.org/json2.js"></script>
 <script>
 var json;
 $(document).ready(function() { 
 jQuery .getJSON("http://127.0.0.1/conn_mysql.php", function (jsonData) {
 json = eval(jsonData);
 //json = JSON.parse(jsonData);/*error if uncomment:"IMPORTANT: Remove this line from  
                               json2.js before deployment"*/
 $.each(jsonData, function (i, j) {
 document.index.user_spec.options[i] = new Option(j.options);
 });});
 });
 </script>
 </body>
 </html>

【问题讨论】:

  • 你的 HTML 代码有点破...
  • 不要使用 eval() 来解析你的 JSON。使用 JSON.parse(),并包含此文件以兼容旧版浏览器:json.org/json2.js
  • 除了 Golmote 的建议之外:1. 使用 doctype,2. 您不需要 SCRIPT 元素上的语言和类型属性,3. 考虑使用仅使用大写函数名称的约定对于构造函数 4. 考虑在声明使用这些变量的全局函数之前声明全局变量 5. 使用小写标签名称 6. 考虑将 SCRIPT 元素放在页面底部(就在

标签: javascript json eval


【解决方案1】:

在 jQuery 中,$.getJSON() 的回调被解析的 JSON 数据调用;就用它。

$.getJSON("*.php", function(data) {
   $.each(data, function() { alert(this.options); });
);

应该为数组中的每个 {"options": "xyzzy"} 对象发出警报。

EDIT 在 OP 编辑​​他们的帖子后: 您的编辑稍微澄清了一些事情:如果您违反了same origin policy,您将无法取回任何数据 - 而且它也会完全保持沉默 - 如果您违反了same origin policy

基本上(有例外情况(预检检查等)),您可以通过 AJAX 访问完全相同域上的 URL。如果您的 HTML 文件是本地提供的静态文件,则无法访问http://127.0.0.1/;如果你的文件是http://foo.baz.quux.org/,你不能简单的AJAX转换成http://mordor.baz.quux.org

【讨论】:

  • 实际上我需要使用这个脚本来附加 JSON 数据(我从服务器接收并构建一个下拉列表)与用户输入并将其发送回服务器以保存并发送一组新的更新 JSON 到使成为。通过回显/警报,我试图看到我接收数据并对其进行操作。我编辑了代码。
  • 为我的回答添加了说明。 HTH
  • 在出现这种冲突的情况下,您能告诉我什么解决方案吗?但正如我上面所说,该列表由服务器数据填充,并且 eval 还将 json 解析为 javascript,因为 json.length 执行但我无法操作它。
  • 在您的示例中添加127.0.0.1/conn_mysql.php 暗示您尝试进行跨域AJAX,这不是直接可能的。如果 HTML 文件确实位于 conn_mysql.php 脚本旁边,则只需使用 $.getJSON("conn_mysql.php", ...)。
  • getJSON 会给你的回调 JSON 已经解析(假设你提供它 - 也许在所有情况下,不确定)。但是如果你试图违反同源策略,你将一无所获——在你的回调函数中可能是一个空白字符串,或者null
【解决方案2】:

我认为这里的问题与 eval/parse 等或同源策略无关。您的 json 是一个对象数组,每个对象都包含一个名为 options 的成员。所以你不能做json.options[0],你必须做json[0].options

【讨论】:

  • 应该将此作为评论添加到 AKX 的答案中,但看起来我还不能评论其他人的东西。
  • thanX,你是对的。我已经以与您在这里写的相同的方式完成了它,即 json[0].options
【解决方案3】:
var json = [{"options":"smart_exp"}, {"options":"user_int"}, {"options":"blahblah"}]

for (var i = 0; i < json.length; i++){

    alert(json[i].options)

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多