【问题标题】:In JavaScript & JSON, why is the result of str = JSON.stringify(obj); equal to {}?在 JavaScript & JSON 中,为什么 str = JSON.stringify(obj); 的结果是等于 {}?
【发布时间】:2017-07-21 21:06:02
【问题描述】:

我最近刚开始自学 JavaScript 和 JSON。这个半项目是我第二个 JavaScript 项目的一部分。请对我温柔一点。

我正在尝试输入一个 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 : {}

在 BBEdit for Mac 中编写并保存为 Unicode (UTF-8) 文件的 JSON 文件是:

{
"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:

好的,我重新格式化了 JSON 文件并使用在线 JSON 验证器 (Free Online JSON Formatter) 对其进行了验证。我仍然得到相同的结果。 (我还插入了一个新的第一段。)

【问题讨论】:

  • 您的 JSON 无效
  • JSON 仅适用于 普通对象
  • @hindmost:不是真的。只要该对象具有自己的、可枚举的属性以及字符串名称和适当的值,它是“普通”对象还是主机提供的对象或...

标签: javascript json stringify


【解决方案1】:

JSON.stringify (spec, MDN) 仅包含符合所有以下条件的属性:

  • 它们是自己的属性(不是对象从其原型继承的属性)
  • 它们是可枚举的属性(例如,出现在for-in循环中的那种)
  • 它们的名字是字符串(不是符号)
  • 它们的值不是undefined 或函数

您尝试转换为 JSON 的对象似乎只有继承的或不可枚举的属性,和/或值为 undefined 或函数的属性。


另外,以防万一有任何混淆:请注意,files[0] 不会包含从文件中加载的 JSON。 files[0] 只是input type="file" 中文件列表中该文件的记录。要加载其内容,您必须使用FileReaderThis answer (of mine) 展示了如何做到这一点。一旦你读过它(可能使用readAsText),你就会得到JSON字符串(然后可以使用JSON.parse将其转换为对象结构)。

【讨论】:

  • 值得包含一个描述该行为的规范链接:ecma-international.org/ecma-262/6.0/#sec-json.stringify(见注 5 和注 6)
  • @kamituel:不是相当忍者,因为你的评论。 :-)
  • @T.J.Crowder 我相信我明白你在说什么。看来我还有很多研究要做。非常感谢您提供广泛而翔实的答案。您的最后一段(“单独,虽然,......”)非常有帮助。对我来说,这是答案的核心,尽管它似乎是你事后才想到的。
  • @alxfyv :-) 有点,起初我以为您试图将该文件记录(而不是内容)转换为 JSON 字符串以发送到服务器或其他东西。然后我想“好吧,那他为什么要在问题中包含 JSON 文件呢?”并想我会覆盖我的基地。
猜你喜欢
  • 2019-05-10
  • 1970-01-01
  • 2020-02-18
  • 2013-09-20
  • 2013-11-13
  • 1970-01-01
  • 1970-01-01
  • 2014-09-11
  • 1970-01-01
相关资源
最近更新 更多