javascript数组中的JSON导致错误无法读取属性

时间:2014-07-22 00:55:25

标签: javascript jquery json

我有一些javascript在一年多的时间内没有改变,突然之间就突然崩溃了。所以我的第一个想法是必须与数据相关。在查看数据时,看起来结构在一年内没有变化。已经很好的运行了很长时间,然后它突然崩溃了。

这是我的js,用一些JSON填充数组:

var history = [{BillingCycleHistoryID: 339, BillingCycleDate: '7/18/2014', StartTime: '7/18/2014', PercentComplete: 100, EndTime: '7/18/2014', HoursRan: 0.16, StartedBy: 'ADMIN'}];

Chrome开发者工具栏报告此错误:"未捕获类型错误:无法读取未定义的属性BillingCycleHistoryID。"该错误在" value.BillingCycleHistoryID"的行上被触发。下面...

if (typeof history != 'undefined') {
   $.each(history, function (key, value) {
      tbl.append(
        '<tr data-history-id="' + value.BillingCycleHistoryID + '">' +
        ....[more down here]

当我将json粘贴到jsonlint中时,它会抛出一个对我来说没有意义的错误:

Parse error on line 2:
[    {        BillingCycleHistoryI
--------------^
Expecting 'STRING', '}'

enter image description here

知道这里发生了什么吗?

4 个答案:

答案 0 :(得分:2)

您的代码是有效的javascript,而不是其他人指出的严格有效的JSON。

在屏幕截图中,历史记录变量看起来不应该(它的长度应为1)。你可能只需要重命名它:'history'似乎是Chrome控制的全局变量。如果Chrome最近添加了此行为,则可以解释您的代码突然崩溃的原因。

请参阅http://www.javascripter.net/faq/reserved.htm

'history'严格来说并不是一个保留字,但最好还是作为全局变量名避免。 (如果你能避免它,那么使用全局变量是不明智的。)

答案 1 :(得分:1)

jsonlint错误来自于您没有将密钥括在引号中。这将正常工作,但jsonlint不喜欢它。您可以在常见问题解答中看到这一点:http://jsonlint.com/#

  

期待&#39; STRING&#39;,&#39; NUMBER&#39;,&#39; NULL&#39;,&#39; TRUE&#39;&#39; FALSE&#39;,& #39; {&#39;,&#39; [&#39;

     

您的列表末尾可能还有一个额外的逗号。类似的东西:[&#34; a&#34;,&#34; b&#34;,]   您也可能没有将收藏键括在引号中。一个集合的正确格式是:{&#34; key&#34;:&#34; value&#34; }

答案 2 :(得分:0)

字符串和变量应该用双引号试试这个:

[
    {
        "BillingCycleHistoryID": 339,
        "BillingCycleDate": "7/18/2014",
        "StartTime": "7/18/2014",
        "PercentComplete": 100,
        "EndTime": "7/18/2014",
        "HoursRan": 0.16,
        "StartedBy": "ADMIN"
    }
]

答案 3 :(得分:0)

我认为你对JSON是什么感到困惑,你的例子根本就没有使用JSON。

如果你使用的是JSON,你会有类似的东西(如果使用jQuery)

var history = $.parseJSON("<<json string here>>");

您的示例只是声明一个变量(历史记录),该变量由包含一个匿名本机javascript对象的本机javascript数组组成。我假设您从某些后端代码中将该变量打印到页面上?

但是你的代码看起来是正确的,我在这里有一个有效的例子

http://jsfiddle.net/z5rUw/1/