2011-08-31 138 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瀏覽器,這裏是一些低下的成果。