2017-03-02 85 views
1

我是最近自學的JavaScript & JSON啓動。這個demi-project是我第二個JavaScript項目的一部分。請對我溫柔。在JavaScript和JSON中,爲什麼是str = JSON.stringify(obj)的結果;等於 {}?

我正在嘗試輸入一個JSON文件,將其字符串化並輸出結果字符串。該文件是一個JavaScript對象。但是當我執行語句str = JSON.stringify(obj);時,我得到的結果是str === {}

爲什麼字符串化的文件對象等於{}?我怎樣才能得到它是一個字符串等於JSON文件字符串化?

的JavaScript是:

function handleFileSelect(evt) { 
    var files = evt.target.files; // FileList object 

    // files is a FileList of File objects. List some properties. 
    var output = []; 
    for (var i = 0, f; f = files[i]; i++) { 
     output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a', 
     ') - ', f.size, ' bytes, last modified: ' f.lastModifiedDate ? 
     f.lastModifiedDate.toLocaleDateString() : 'n/a', '</li>'); 
    } 
    document.getElementById('OutputArea').innerHTML = '<ul>' + 
    output.join('') + '</ul>'; 
    var obj = files[0]; 
    var str = JSON.stringify(obj); 
    document.getElementById('OutputArea').innerHTML += "obj : " + 
    obj + "<br><br>obj stringified : " + str; 
} // end def fn handleFileSelect 

// set event listener on InputArea 
document.getElementById('InputArea').addEventListener('change', 
handleFileSelect, false); 

的HTML是:

<html lan="en"> 
    <head> 
     <title="A JSON exercise"></title> 
    </head> 
    <body> 

     <input id="InputArea" name="files[]" type="file" accept="application/json" 
     multiple /> 
     <output id="OutputArea"</output> 

    </body> 
</html> 

中的JavaScript相關的輸出是:

obj: [object File] 

object stringified : {} 

JSON文件,在BBEdit中的Mac組成並保存爲Unicode(UTF-8)文件,爲:

{ 
"FHC-Class-Schedule" : [ 

    { 
     "time" : "0830", 
     "room" : "A-I", 
     "classTitle" : 
      "Keynote Address", 
     "classDescription" : 
      "Room I [content to come]", 
     "instructorName" : "Crista Cowen", 
     "instructorGender" : "female", 
     "instructorBio" : 
      "Crista Cowan has been employed by Ancestry.com since 2004.", 
     "instructorImgHref" : 
      "" 
    } 
    ] 
} 

在CodePen有一支筆:A JSON Exercise。您將需要一個本地JSON文件來輸入。

任何幫助將非常感激

編輯01:

OK,我重新格式化的JSON文件,並與在線JSON驗證器(Free Online JSON Formatter)驗證它。我仍然得到相同的結果。 (我還插了新的第一段)

+0

您的JSON無效 –

+0

JSON僅適用於**普通對象** – hindmost

+1

@ behindmost:並非如此。只要該對象具有帶有字符串名稱和適當值的自己的可枚舉屬性,無論它是「普通」對象還是主機提供的對象或... –

回答

4

JSON.stringifyspecMDN)僅包括適合以下所有條件屬性:

  • 他們自己屬性(不那些對象繼承其原型)
  • 它們是可枚舉屬性(例如,顯示在for-in環路上的那種)
  • 他們的名字是字符串(不是符號)
  • 它們的值並不undefined或功能

你想轉換爲JSON似乎只繼承或不可枚舉的屬性的對象,和/或值爲undefined或功能的。


另外,雖然,萬一有任何困惑:需要注意的是files[0]不會從該文件包含加載的JSON。 files[0]只是input type="file"中文件列表中該文件的記錄。要加載其內容,您必須使用FileReaderThis answer (of mine)顯示瞭如何做到這一點。一旦你讀了它(可能使用readAsText),你會得到JSON字符串(然後可以使用JSON.parse將它轉換爲對象結構)。

+0

值得包括描述該屬性的規範的鏈接行爲:http://www.ecma-international.org/ecma-262/6.0/#sec-json.stringify(見注5和注6) – kamituel

+0

@ kamituel:不*很*忍者,因爲你的評論。 :-) –

+0

@ T.J.Crowder我相信我明白你在說什麼。看來我有更多的研究要做。非常感謝廣泛和豐富的答案。您的結尾段落(「另外,但是......」)非常有用。對我來說,這是答案的肉,儘管它似乎是你事後的想法。 – alxfyv

相關問題