2017-03-16 46 views
6
$.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:的Javascript:试图访问一个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) 
+0

你有一个字符串。使用'JSON。解析()'正确 – Weedoze

+0

你为什么要将它串起来再解析一遍? – Cruiser

+0

您已经将json字符串保存在本地存储中,为什么要调用stringify两次? – abhishekkannojia

回答

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符号表示它:非阵列对象的

  • 属性,不能保证以任何特定的顺序来字符串化 。不要依赖 中的属性在字符串化中的相同对象的排序。字串中
  • BooleanNumberString对象被转换为相应的的原始值 ,在符合传统转换 语义。
  • 如果未定义,函数或符号在 转换过程中遇到(或在对象中找到对象时)或 被删除(当它在数组中找到时)。 JSON.stringify可以 还传递“纯”值,如 JSON.stringify(函数(){})或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

+1

虽然它像'JSON.parse(JSON.stringify(sessionStorage.getItem( “JSON”)))刚redundent代码;'但字符串化字符串然后解析它为json使它的值字符串?怎么来的? –

+4

@AnikIslamAbhi:你总是找回原来的价值。原始值('sessionStorage.getItem(“json”)')是一个字符串。 'JSON.parse(JSON.stringify(“foo”))===“foo”'。 *“将其解析为json”*没有任何内容被解析*为* JSON。 'JSON.stringify' *创建JSON *。 'JSON.parse'从JSON创建一个本地JavaScript值。如果一个字符串值被编码为JSON,你会得到一个字符串值。如果数字值被编码为JSON,则会得到一个数字值。如果一个数组被编码为JSON,你会得到一个数组等等。 –

+0

@FelixKling你太棒了 –

相关问题