【问题标题】:Javascript json_encode > JSON.parse() arrayJavascript json_encode > JSON.parse() 数组
【发布时间】:2014-01-13 17:17:42
【问题描述】:

我下面的PHP代码:

echo "<img src='../images/edit.png' onclick='showEditDiv(" . json_encode($row) . ");'>";

这是 HTML 结果:

<img src='../images/edit.png' onclick='showEditDiv({"ID":"2","NAME":"John Smith","EMAIL":"johnsmith@domain.com"});'>

这里是 Javascript 代码:

function showEditDiv(data) {
  alert(data);
  data = JSON.parse(data);
  alert(data);
  for (i=0; i< data.length; i++){ 
    alert(data[i]);
  };
}

问题是我没有在 JS 参数中获得所需的数组。 第一个警报显示“[object Object]”,仅此而已,没有更多警报。 问题出在哪里?我的代码基于我在这里找到的示例。我想要的只是将一个数组传递给 JS 函数,该函数位于一个单独的 .js 文件中。我不想用 JQuery,更喜欢原生 JS。

【问题讨论】:

  • 你拥有的不是一个数组。它是一个对象字面量。你到底想要什么
  • @PSL:我相信 OP 在 PHP 意义上使用“数组”(hash-array-bag-thingy)。

标签: javascript php html arrays


【解决方案1】:

您没有将 JSON 传递给函数(JSON 将是一个字符串,因此以引号结尾/开头)。你传递的是一个 JavaScript 对象字面量。看看区别:

对象字面量

{"ID":"2","NAME":"John Smith","EMAIL":"johnsmith@domain.com"}

JSON 字符串

"{\"ID\":\"2\",\"NAME\":\"John Smith\",\"EMAIL\":\"johnsmith@domain.com\"}\"
// or, easier than escaping all those quotes..
'{"ID":"2","NAME":"John Smith","EMAIL":"johnsmith@domain.com"}'

当然,出于您的目的,对象字面量可能更易于使用。在这种情况下,您只需从 JavaScript 代码中删除 JSON.parse

function showEditDiv(data) {
    // The below won't work unless you change your input data to a
    // JS array literal..
    /* for (i=0; i< data.length; i++){ 
        alert(data[i]);
    }; */

    // ..but you can do this (though it's risky to iterate through keys
    // on an object without at least using HasOwnProperty)
    for (var key in data) {
        alert(data[key]);
    }
}

【讨论】:

  • 什么是 JSON 字符串?您的意思是这里的转义字符串。还是您将&amp;lt;span&amp;gt; 称为html 字符串?
  • @Neikos:JSON 始终是一个字符串。 JS 对象几乎是一样的东西,但是作为 JavaScript 中的一个结构。 {} 是(一个空的)JavaScript 对象; "{}"是与之对应的JSON数据格式。
  • 没有。 { "data": "value" } 既是 JSON 也是 JS。
  • @Neikos 上下文显然很重要,您在这里争论毫无意义的语义。您刚刚发布的是 JSON,但它不是 JavaScript 代码中的 JSON,因为它不是字符串。
  • 此外,JSON始终是一个字符串,因为 JSON 是根据 Unicode 编码定义的。如果您将其粘贴到 JavaScript 脚本中,您发布的不是 JSON,它是 only 一个对象文字。
【解决方案2】:

我想要的只是将一个数组传递给 JS 函数

这是 JS 中的对象,而不是数组。 (PHP 命名法有点奇怪。)而且你已经成功通过了。但是,当您将对象转换为字符串时(alert 必须这样做),它会显示为[object Object]。如果您想要字符串表示,请将其转换回字符串:

alert(JSON.stringify(data));

您不需要JSON.parse 它,因为它已经是一个对象 - 您已将它作为 PHP 中的文字插入,而不是作为字符串插入。事实上,在你的代码中运行 JSON.parse 应该会导致错误,这就是为什么没有更多的警报 - 代码停止,抱怨 JSON.parse 口中的坏品味。

【讨论】:

    【解决方案3】:

    JSON 是 Javascript 的子集。这意味着如果使用得当,它也是有效的 javascript。

    在这种情况下,您实际上是在通过一个对象,这也是您的警报告诉您的。 JSON.parse 然后应该出错。

    如果你想传递一个数组,你必须改变你的数据源。 (虽然从外观上看,数组不是必需的。)

    【讨论】:

      【解决方案4】:
      {"ID":"2","NAME":"John Smith","EMAIL":"johnsmith@domain.com"} is already a json. 
      

      这就是为什么你的alert[object Object]。它也不是循环数组。您可以通过这种方式获取它的数据:

      function showEditDiv(data) {
        alert(data);
        alert(data.ID);
        alert(data.NAME); // etc..
      }
      

      如果你想要一个数组,这里是example

      【讨论】:

      • 谢谢,这是一个有用的信息!唯一的问题是我想要一个数组,而不是一个对象。
      • 那么在使用“alert(data[i]);”时你想要什么?值等于 2 的 ID?还是包含上述所有信息的整个对象?
      • 嗯,这是一个很好的问题 :) 我不熟悉 JS,我需要一个与 PHP 相同的关联数组,因此正如您所指出的,我的代码完全错误。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-02
      • 2016-02-28
      • 1970-01-01
      相关资源
      最近更新 更多