【问题标题】:Basic JSON.parse question基本 JSON.parse 问题
【发布时间】:2009-09-21 21:41:49
【问题描述】:

我似乎无法访问我的对象。

解析服务器字符串后:

var json = JSON.parse(myJsonText):

我收到以下提示:

alert(json.param1)

{"ID":17,"Name":"swimming pools","ParentID":4,"Path":""},
{"ID":64,"Name":"driveways","ParentID":4,"Path":""}

现在,我正在尝试访问 ID 和名称。

我试过了:

json.param1[0].ID
json.param1[0]["ID"]
json.param1[0][0]

还有很多其他人真的赚不了多少钱 感觉如:

json[0].ID or 
json.param1.ID etc...

我得到(例如,在 json.param1[0].ID 的情况下):

param1.0.ID 为 null 或不是对象。

有什么想法吗?

【问题讨论】:

  • 您可能想要发布原始 JSON 的片段或样本,而不是警报版本 - Array.toString 不返回有效的 JSON,这可能会产生误导。
  • 是的,myJsonText 的值是什么引起您的警报?

标签: javascript json parsing


【解决方案1】:

试试这个

// you already have this bit
var json = JSON.parse(myJsonText);
alert(json.param1);

// add this
var tmp_param1 = JSON.parse(json.param1);
json.param1 = tmp_param1;
alert(json.param1);  // should print [object, object] or similar

alert(json.param1[0].ID);  // should print "17"
alert(json.param1[0].Name);  // should print "swimming pools"

【讨论】:

  • 谢谢,成功了。我必须首先执行此操作的服务器端出了什么问题?
  • 服务器将主要 JSON 文本 (myJsonText) 作为带引号的 字符串 数组发送,而不是 JSON 对象 数组。每个字符串都是一个 JSON 文本,需要第二个 parse 才能获取对象。如果你alert(myJsonText) 仔细看,我打赌你会看到多余的引号。
  • 是的,这就是正在发生的事情。我猜没有真正的理由重新访问我的服务器逻辑并更改 JSON 传递给客户端的方式。我将使用您的解决方案进行将来的解析。再次感谢。
【解决方案2】:

这看起来像是无效的 JSON。尝试将其包装在括号中,使其成为有效的 JSON 对象数组。然后通过索引访问它。

[
    {"ID":17,"Name":"swimming pools","ParentID":4,"Path":""},
    {"ID":64,"Name":"driveways","ParentID":4,"Path":""}    
]

【讨论】:

  • 他说那是调用alert(json.param1)的输出
  • 不管那仍然是无效的JSON。
  • 这就是我的意思:它不是 JSON,它是一个对象的输出,显然是从某个 JSON 成功创建的。
  • @nickf:如果它是一个有效的警报对象,我本来希望在警报中看到 [object] 或其他内容。我不相信对象的 JSON 格式会被提醒。
  • @nickf:看看数组之外的对象。 ;) alert(json.param1) 应该是 "[object],[object]"
【解决方案3】:

如果您在警报中收到原始 JSON,那么这会让我相信您尝试解析的 JSON 存在问题。

【讨论】:

  • 如果原始 JSON 有问题,那么他将无法看到 json.param1 的值...
  • 数组可能没问题,但其中的对象似乎被解析为字符串:(缩写)["{\"ID\":17}","{\"ID\":64}"] 因此,在收到警报时看到{"ID":17},{"ID":64}
【解决方案4】:

在所有 cmets 上编译和扩展... ;)


您发现问题的第一个线索是您的警报:

alert(json.param1)

而不是得到:

{"ID":17,"Name":"swimming pools","ParentID":4,"Path":""},
{"ID":64,"Name":"driveways","ParentID":4,"Path":""}

您应该得到类似于以下的内容:

[object],[object]

尝试提醒typeof 数组元素本身:

alert(typeof json.param1[0]) //=> should say "object"

如果您得到除 "object" 之外的任何内容,则说明 JSON 格式不正确或解析器失败。


判断哪个错误的一个好线索是原始 JSON 是否如下所示:

{"param1" : [
  "{\"ID\":17,\"Name\":\"swimming pools\",\"ParentID\":4,\"Path\":\"\"}",
  "{\"ID\":64,\"Name\":\"driveways\",\"ParentID\":4,\"Path\":\"\"}"
]}

那么,很可能是 JSON 损坏了。 (对不起;)

另一方面,如果您的 JSON 如下所示:

{"param1" : [
  {"ID":17,"Name":"swimming pools","ParentID":4,"Path":""},
  {"ID":64,"Name":"driveways","ParentID":4,"Path":""}
]}

那么,它可能是解析器。

【讨论】:

    【解决方案5】:

    如果json.param1 是您所说的那样,那么json.param1[0].ID 应该可以工作(并评估为“17”)。

    如果它不起作用,您能否向我们展示您正在解析以生成 JSON 对象的文本?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-06
      • 2013-07-06
      • 2016-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-01
      相关资源
      最近更新 更多