【问题标题】:Why is my JSON object undefined?为什么我的 JSON 对象未定义?
【发布时间】:2012-12-10 20:36:41
【问题描述】:

我正在尝试解析 JSON 数据结构,但我认为应该是数据返回未定义。

这是我正在使用的 jQuery:

....
var messages = data.messages;

$.each(messages, function(i, val) {

    var user = messages[i];

    //console.log(user);
    console.log(user['msg']);

});

PHP 数据结构如下所示:

...
$message_info = array();

$message_info[$row['username']]['prvt'] = 1;
$message_info[$row['username']]['msg'] = stripslashes($row['message']);
$message_info[$row['username']]['ts'] = $row['timestamp'];

...

$message_list[] = $message_info;

...

$res->messages = $message_list;
echo json_encode($res);

如果我将用户转储到控制台,输出如下所示:Object

{john: Object}
  john: Object
  msg: "test msg"
  prvt: 0
  ts: "2012-12-10 09:16:13"

这是控制台中数据的样子:

Object {success: true, lastid: "60", messages: Array[15]}
lastid: "60"
messages: Array[15]
  0: Object
    john: Object
      msg: "test msg"
      prvt: 0
      ts: "2012-12-10 09:16:13"
  1: Object
    john2: Object
      msg: "test msg2"
      prvt: 1
      ts: "2012-12-10 09:18:13"
 ...

知道为什么我无法访问和检索 msg 的内容吗?

【问题讨论】:

  • 试试echo json_encode($message_list,JSON_FORCE_OBJECT);
  • 你确定不是user.john.msg
  • 如果上述方法不起作用,则在您获得 data 变量后立即使用 console.log(data) 可能会有所帮助。另请注意,您不需要user = messages[i],因为val 参数已经设置为messages[i]
  • 您是否使用 AJAX 获取此 JSON?您是否尝试在 AJAX 回调完成之前访问数据?
  • @nnnnnn 刚刚添加了数据的输出

标签: php javascript jquery json


【解决方案1】:

重写您的 PHP 以避免将 msg 嵌套在 $row['username'] 内:

$message_info = array();
$message_info['username'] = $row['username']; // find this in JS with user['username']
$message_info['prvt'] = 1;
$message_info['msg'] = stripslashes($row['message']);
$message_info['ts'] = $row['timestamp'];

通过该更改,您的 JavaScript 应该可以按原样运行。

【讨论】:

  • 那行得通,但我仍然不明白为什么我不能将用户名作为密钥引用...
  • 因为用户名每次都不一样,导致你无法编写代码访问下面的数据。如果您想使用用户名来定位数据,请遍历数组并测试 user['username'] 是否等于给定字符串。
  • 谢谢,我想我做的比它必须的更难。再次感谢!
【解决方案2】:

您的用户对象包含由键“john”、“john2”等引用的对象。

user.john.msg or user.john2.msg

应该可以。

因此,要在 php 中构建更通用的 json 结构,我将执行以下操作:

...
$message_info['user']['name'] = $row['username'];
$message_info['user']['prvt'] = 1;
...

【讨论】:

  • 用户名可以是任何东西,所以我可以像这样进行静态调用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-06
  • 2019-01-21
  • 2020-04-14
  • 1970-01-01
  • 1970-01-01
  • 2021-05-28
  • 1970-01-01
相关资源
最近更新 更多