Javascript:尝试访问JSON数组的元素会给我个性化的角色

时间:2017-03-16 13:50:19

标签: javascript arrays json

$.ajax({
    url: "get_cards.php",
    type: "GET",
    data: {selection:JSON.stringify(selection)},
    success: function(data) {
        var json = JSON.parse(data);
        sessionStorage.setItem("json", JSON.stringify(json));
    }
});

然后,在另一个文件中,我正在从sessionStorage中检索JSON:

var json = JSON.parse(JSON.stringify(sessionStorage.getItem("json")));
if(json) {
    sessionStorage.removeItem("json");
}

这给了我一组JSON对象,例如:[{'name':'Bob',...}]。但是,当我尝试访问数组的第一个元素:json[0]时,我得到'[',当我尝试json[0].name时,我得到undefinedjson的长度报告为159,因此它将每个单独的字符计为元素。

编辑:当我更新到:

var json = JSON.parse(sessionStorage.getItem("json"));
if(json) {
    sessionStorage.removeItem("json");
}

我的长度为1(这是正确的),但访问json[0].name时出错:

Uncaught TypeError: Cannot read property '0' of null
at HTMLDocument.<anonymous> (studying.js:10)
at j (jquery.min.js:2)
at k (jquery.min.js:2)

1 个答案:

答案 0 :(得分:8)

您正在对已经字符串化的json进行字符串化:

var json = JSON.parse(JSON.stringify(sessionStorage.getItem("json"))); // wrong !

这应该是:

var json = JSON.parse(sessionStorage.getItem("json"));

如果你JSON.stringify("foo"),那么你会得到一个带引号的字符串:"\"foo\""

  

JSON.stringify()将值转换为表示它的JSON表示法:

     
      
  • 不保证非数组对象的属性是字符串化的   以任何特定的顺序。不要依赖于内部的物业订购   字符串化中的同一个对象。
  •   
  • BooleanNumber和   String个对象将转换为相应的原始值   在字符串化过程中,符合传统的转换   语义。
  •   
  • 如果未定义,则会遇到函数或符号   转换它被省略(当它在对象中找到时)或   审查为null(当在数组中找到它时)。 JSON.stringify可以   也只是在传入&#34;纯粹&#34;时返回undefined价值观   JSON.stringify(function(){})或JSON.stringify(undefined)。
  •   
  • 所有   即使使用,符号键控属性也将被完全忽略   替代品功能。
  •   
  • 将忽略不可枚举的属性
  •   
     

示例:

 JSON.stringify({});                  // '{}'
 JSON.stringify(true);                // 'true'
 JSON.stringify('foo');               // '"foo"'
 JSON.stringify([1, 'false', false]); // '[1,"false",false]'
 JSON.stringify({ x: 5 });            // '{"x":5}'

Source: MDN