【问题标题】:JavaScript JSON.parse returning array property as undefinedJavaScript JSON.parse 返回数组属性为未定义
【发布时间】:2018-01-14 06:36:13
【问题描述】:

这里真正的问题不是未定义的属性,但我无法找出原因。它是一个 PHP 挂起的大 JSON 字符串,它包含一个文件列表、子目录列表等以及一个名为 Mt 的 Object 中的一些额外信息。这个 Mt 有一些属性,一些字符串,对象和两个数组,它们都是未定义!

Mt JSON 字符串:

    {
    "Mt": {
        "About": "Dublin Core Metadata Based, project DC+, version 1.0",
        "Name": "AlgunsEBooks",
        "Version": "1.0",
        "FileExtension": "mt",
        "Fields": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
        "IndexedFields": [1, 2],
        "FieldKey": "1",
        "StringEncoding": {
            "Text": "URI",
            "Code": "none",
            "Date": "none",
            "RasterImage": "Base64",
            "VectorImage": "Base64"
        },
        "DescriptionFieldsBasic": {
            "previousFileName": "String",
            "previousFileTime": "String",
            "icone": "String-RasterImage",
            "orelha": "String"
        },
        "DescriptionFieldsExtras": {
            "obs": "String"
        },
        "DescriptionType": "Object",
        "IncludedFilesMasc": "{base}.{ext}",
        "IncludedFilesFields": {
            "base": "{base}",
            "ext": "pdf|epub|jpg"
        }
    }
}

我确实通过 jsonlint.com 对其进行了验证。通过使用 JSON.parse 它将完美地变成一个对象。但是,当我在对 PHP (执行文件列表并生成 JSON)的请求后收到相同的字符串时,将无法正常工作。 “Fields”和“IndexedFields”属性均未定义。

从 xmlhttprequest 返回的字符串可能包含一些在这些特定点使 JSON 无效的字符,但是当我通过 console.log 打印字符串时,我得到的字符串是有效的。我试图复制由 console.log 打印的字符串并在单独的测试代码中执行 JSON.parse 并且它可以工作,因此打印的字符串不是 var 的所有内容。 我还尝试将 PHP 答案保存到文件中,结果又是一个有效的字符串,问题接缝是 xmlhttprequest 事件在加载时返回的字符串。错误肯定在 var 内部,但我看不到。

有什么想法吗?

【问题讨论】:

  • 使用 try catch 来验证 JSON 是否完整。另外,我会建议您向 PHP 发送一些值,这些值可以帮助您识别您构建的 JSON 的任何属性的值何时为 null 或填充 0 或任何 bool 值。
  • JSON 不会生成要捕获的错误,只是将数组解析为未定义,但无论如何我都会尝试。另外,传代码看会不会报错的想法也是个好主意,我也试试。
  • 如何检查FieldsIndexedFields 是否为undefined
  • 当我通过 console.log 打印对象时,这些属性是未定义的。我执行此过程是为了与单独的测试代码结果进行比较。

标签: javascript json string


【解决方案1】:

我的问题被否决了,所以人们可能不感兴趣,也不会发布任何答案,所以我会自己做,而不是要求别人做。

确实有一个答案,而且非常重要!

按照 Fernando Urban 的建议,我开始向 Fields 和 IndexedFields 发送其他值以查看会发生什么,结果始终未定义。所以我在整个过程中将名称 Fields 更改为 StrangeThings。所以 StrangeThings 产生了我期待的数组 - 完美!但是该对象仍然具有字段:未定义,而不是在 console.log 打印对象之前我开始搜索此属性的来源,但没有。字段是由虚无创造的吗?最后我记得我在多年前使用 Flash - AS3 时已经遇到过这种麻烦:

控制台显示的值是在它自己的行之后创建的。在 console.log 下面有两个函数处理这些数组(这些数组是与另一个数组关联的数字)。这些函数有类型错误,结果未定义(稍后会处理)。一旦我删除了这些行,Fields 就消失了,IndexedFields 返回了预期的数组。

所以在某些情况下,我们必须在调试时考虑非线性执行。我在 Safari、Firefox 和 Chrome 中进行了测试,这是一个标准,但我没有更多信息 - 如果你有,请提供!

【讨论】:

  • 所以您的意思是您确实记录了整个解析的对象,然后在控制台的实时视图中检查该对象中的值?如果是这样,是的,这是正常的。如果您想查看实际值,则需要记录您感兴趣的键/值对,或者记录您的对象的克隆。
  • 正常但不寻常。我希望将这种情况作为警告,仅记录对象并不能保证找到确切的点。
  • 但是将来遇到同样问题的任何人(console.log(object) => 'object' 的实时表示)都不太可能来您的 Q/A .问题正文中没有任何内容与此相关,甚至您的答案也不清楚。
  • 我在想这个,标题是关于一个有很多原因的情况。另一方面,糟糕的 JSON 解析是一个常见的故障……在我看来,无论如何我们应该让它,谁知道呢,但如果社区不这么认为,我们可能会删除它。我只是在我解决了我的问题后,其他人可能会觉得它很有用。
猜你喜欢
  • 1970-01-01
  • 2017-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-16
相关资源
最近更新 更多