【问题标题】:JSON.stringify in Explorer 11资源管理器 11 中的 JSON.stringify
【发布时间】:2016-08-20 19:26:46
【问题描述】:

我有 1 行代码使我在 Explorer 11 中的整个 JavaScript 文件崩溃,但在 google chrome 49.0.2623 中运行良好。 我通过 AJAX 使用以下代码“导出”javascript 对象。

在 Chrome 中:

function AjajPostComponentLists()

{

  var myFileContent = new Uint8Array();

   var aList1 = {FixedItems:1, List:["None", "Relay #1", "Relay #2"]};
   var aList2 = {FixedItems:1, List:["None", "Input #1", "Input #2", "Input #3", "Input #4", "Input #5"]};
   var aList3 = {FixedItems:1, List:["None", "Door #1", "Door #2"]};

   // ... (I won't list them all)

   myFileContent = JSON.stringify({aList1, aList2, aList3});

   // ...
}

结果将如下所示:

{"aList1":{"FixedItems":1,"List":["None","Relay #1","Relay #2"]},"aList2":{"FixedItems":1,"List":["None","Input #1","Input #2","Input #3","Input #4","Input #5"]},"aList3":{"FixedItems":1,"List":["None","Door #1","Door #2"]}}

Explorer 11 抱怨:

SCRIPT1003: ':'attendu(期待中,我的 explorer 是法语)

无论如何,错误是指显然不相关的三元运算符。

我试图用方括号代替花括号,它“通过”了,除非我在过程中松了很多(例如对象名称)。

知道为什么这在 Chrome 上会正常运行,但在 IE 上不行吗?

谢谢

【问题讨论】:

  • Expected ':'。 IE11 不支持 ES6
  • IE 不支持对象字面量中的shorthands,由 ES6 添加。您需要为每个值提供一个键 –– { aList1: aList1, aList2: aList2, ... }

标签: javascript json google-chrome internet-explorer ecmascript-6


【解决方案1】:

感谢您的反馈,这大大改进了我的代码加上,使 IE 再次工作。我在这里总结一下:

  1. 创建一个全局对象数组:

var aEditableObjects = { 中继:{FixedItems:1,列表:[“无”,“中继#1”,“中继#2”]}, 输入:{FixedItems:1, List:["None", "Input #1", "Input #2", "Input #3", "Input #4", "Input #5"]}, 门:{FixedItems:1, List:["None", "Door #1", "Door #2"]} };

  1. 字符串化,通过 AJAX 发送

    myFileContent = JSON.stringify(aEditableObjects);

    myFileContent = encodeURI(myFileContent); // 兼性,用于特殊字符

  2. 通过 AJAX 再次挽救它

    try{aEditableObjects = JSON.parse(decodeURI(xmlhttp.responseText));}catch(e){AjajError("AjajGetComponentLists");}

【讨论】:

    【解决方案2】:

    问题在于IE doesn't support ES6 对象字面量扩展即:

    var text = 'some text';
    var obj = { text };
    console.log(obj); // { text: 'some text' }
    

    要解决此问题,您必须声明相应变量的属性名称:

    myFileContent = JSON.stringify({
        aList1: aList1,
        aList2: aList2,
        aList3: aList3
    });
    

    但为了更容易(因为你有很多 aListX 变量)让我们这样做:

    // Instead of aList1 = x, aList2 = y, let's make an array of lists
    var aList = [];
    aList.push({FixedItems:1, List:["None", "Relay #1", "Relay #2"]});
    aList.push({FixedItems:1, List:["None", "Input #1", "Input #2", "Input #3", "Input #4", "Input #5"]});
    aList.push({FixedItems:1, List:["None", "Door #1", "Door #2"]});
    
    // ...
    
    var aListObj = {};
    for (var i = 0; i < aList.length; i++) {
        aListObj['aList' + (i + 1)] = aList[i];
    }
    
    myFileContent = JSON.stringify(aListObj);
    

    瞧!现在您不必在最终对象中输入每一个,只需遍历数组即可。输出将根据需要。

    【讨论】:

    • 有趣...我马上就开始了!谢谢 :)
    • 在你上面的例子中,有没有办法静态创建对象(没有任何推送代码)?这些是全局变量,我使用的服务器没有“onApplicationStart”,没有“Global.asa”等,因此需要像这样创建它们(语法不好): var aEditbleObjects = [ aRelayList : {FixedItems:1,列表:[“无”,“继电器#1”,“继电器#2”]}; aInputList : {FixedItems:1, List:["None", "Input #1", "Input #2", "Input #3", "Input #4", "Input #5"]}; aDoorList : {FixedItems:1, List:["None", "Door #1", "Door #2"]}; ... ];
    • 是的,尽管您的语法无效。如果aEditbleObjects 是一个数组,那么您将摆脱所有的推送内容,然后循环遍历aEditbleObjects。如果aEditbleObjects 是一个对象,那么您只需将其JSON.stringify 为myFileContent
    【解决方案3】:

    试试JSON.stringify([aList1, aList2, aList3]);参考JSON.stringify

    【讨论】:

    • 是的,正如我在问题中提到的那样,我尝试了方括号,但我在此过程中丢失了数组名称...
    猜你喜欢
    • 1970-01-01
    • 2017-06-20
    • 2016-04-10
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 2023-02-04
    • 1970-01-01
    相关资源
    最近更新 更多