2011-08-31 139 views
35

为什么会JSON.stringify()回报:JSON.stringify返回[]

[] 

的情况与此相同的jQuery:$.JSON.encode()

这是什么原因?我传入一个简单的对象数组,其中每个对象都有字符串属性。我已经循环并提醒每个对象的属性和所有看起来很好,但由于某种原因,两种编码方法返回[]

+11

'JSON.stringify([])===“[]”'。你的对象数组可能是空的。 – Gumbo

+0

不需要为空,但是不可枚举的元素。 – evilpie

+1

我解决了这个问题,它是字符串数组键。不能张贴我自己的答案另外8个小时。 – Chris

回答

49

在你的数组声明

var count_review= new Array() 

,而不是这个用

var count_review={}; 

它的作品!

+6

这两行不一样。第一个是数组,第二个是对象。 Array:'var count_review = [];'... – War10ck

+1

如果您使用JavaScript对象作为关联数组(又名,使用字符串键而不是int键),则此答案是正确的。 – jgerman

+1

在这种情况下使用'var my_array = []'不适用于我(Android Cordova)。确保使用'var my_array = {}',即使之后传递数组。这样做解决了这个问题。 –

10

如果您的数组声明为“字符串”的键值返回NULL

var array = []; 
array['name'] = 'johan'; 
array['age'] = 20; 
alert(JSON.stringify(array))// return [] 

但如果数组声明为“INT”返回JSON字符串

var array = []; 
array[0] = 'johan'; 
array[1] = 20; 
alert(JSON.stringify(array))// return["johan",20] 
2

虽然上述回答是真实,充分理解它肯定需要更多的上下文。

JSON是一种通用格式(支持多种希望所有编程语言),它不完全是JavaScript对象的1对1映射。

所以造成这种情况的根本原因是在JSON中(如RFC 7159所指定的),在JavaScript的Array意义上没有关联数组 - 即键的字符串为数组的数组。在阅读RFC规范可能会相当费时,可以最容易看到的JSON.org网站,它说的顶部(以下一些重点的是我):

JSON是建立在两个结构:

  • 名称/值对的集合。在不同的语言中,这实现为对象记录结构字典哈希表键列表,或关联数组
  • 有序列表值。在大多数语言,这被实现为阵列矢量列表,或序列

这些是通用数据结构。几乎所有的现代编程语言都以不同的形式支持它们。有意义的是,与编程语言可互换的数据格式也基于这些结构。

在JSON,它们采取这些形式:

一种对象无序组名称/值对。一个对象以{(左大括号)开头,以}(右大括号)结尾。每个名称后跟:(冒号),名称/值对由,(逗号)分隔。

JSON Object definition graph

数组是值的有序集合。一个数组以[(左括号)开头并以](右括号)结尾。值由,(逗号)分隔。

JSON Array definition graph

JSON.stringify函数以这样的方式,假设阵列旨在是一个数组,并且所有键控条目是注释性,所以很象是函数对象元素处理此,他们只是抛出它返回的JSON表示之外。不幸的是,这种行为没有在今天(2017-09-04)的非官方JavaScript参考文件中以MDN明确定义且易于理解的方式记录,因此如果您想帮助Mozilla浏览器,这里是一些低下的成果。