【问题标题】:Javascript is not parsing JSONJavascript 不解析 JSON
【发布时间】:2018-04-29 02:39:16
【问题描述】:

注意:- 我刚开始使用带有 javascript 的 JSON,并且正在尝试这个简单的脚本。我想在这里使用 JSON.parse() 来获取数据

这是我的代码的 sn-p

<html>

<body>
  <div id="output"></div>
</body>
<script>
  var text = "'college':{'stream':{'commerce':{'junior':['FY','SY'],'bachelor':['Bcom','BMM']},'science':{'junior':['FY','SY'],'bachelor':['Bsc','BTech']},'arts':{'junior':['FY','SY'],'bachelor':['BA','B.Ed']},}}";
  var jcontent = JSON.parse(text);
  document.getElementById('output').innerHTML += jcontent;
</script>

</html>

什么都没有显示。我不明白有什么问题。任何人都可以帮忙吗? 编辑-我更正了跨越多行的字符串,但它仍然不起作用

【问题讨论】:

  • JavaScript 字符串中不允许换行,除非您使用带有反引号的模板字符串
  • (1) 字符串文字不能跨越多行。这是一个语法错误。使用浏览器的开发者工具。 (2) 即使您可以有新行,您的字符串的内容也不是有效的 JSON。 (3) 没有理由在 JavaScript 文件中定义 JSON。只需通过对象文字创建一个对象。 (4) 即使解析 JSON 可以工作,document.getElementById('output').innerHTML += jcontent; 也不会给您任何有用的结果,因为您正在将对象转换为字符串。
  • 有什么理由不直接使用jcontent = {'college':{ .... }}? JSON 是一个 Javascript 序列化对象,因此很容易用纯 javascript 解析。
  • @h2ooooooo:但是,对象文字不是 JSON。在没有上下文的情况下说“所以很容易用纯 javascript 解析”是一种误导。

标签: javascript json parsing


【解决方案1】:

这个片段有很多问题。

  • JavaScript 不允许在 "" 中使用换行符,您必须在 `` 中使用模板字符串。
  • 您提供的 JSON 字符串不是有效的 JSON:它使用单引号,并且需要一个额外的对象包装器 {}。如有疑问,请点击 https://jsonlint.com/ 并查看它是否解析。
  • 您正在传递返回对象的字符串,并尝试将其打印到网页中。这将产生一个对象的字符串表示,即[Object object],这是相当无用的。
  • 所以你需要对对象进行字符串化才能看到它,这就是你开始的地方......

var text = `
{
    "college": {
        "stream": {
            "commerce": {
                "junior": ["FY", "SY"],
                "bachelor": ["Bcom", "BMM"]
            },
            "science": {
                "junior": ["FY", "SY"],
                "bachelor": ["Bsc", "BTech"]
            },
            "arts": {
                "junior": ["FY", "SY"],
                "bachelor": ["BA", "B.Ed"]
            }
        }
    }
}`;
var jcontent = JSON.parse(text);
// JSON.parse() returns an object, whose string representation is
// "[Object object]", so you actually want to JSON.stringify() this to see it

document.getElementById('output').innerHTML += jcontent;
document.getElementById('output2').innerHTML += JSON.stringify(jcontent, 0, 2);
document.getElementById('output3').innerHTML += JSON.stringify(jcontent['college']['stream']['arts']['junior'], 0, 2);
<html>

<body>
  Original output:
  <pre id="output"></pre>

  Junior arts?
  <pre id="output3"></pre>

  Whole thing:
  <pre id="output2"></pre>
</body>

</html>

【讨论】:

  • 我将运行一个循环来从 JSON 对象中获取实际值。但真正的问题是这些对象甚至没有被检索到。您提供的脚本显示了这个 --- var text = ` {"college": { "stream": { "commerce": { "junior": ["FY", "SY"], "bachelor": ["Bcom ", "BMM"] }, "科学": { "初级": ["FY", "SY"], "单身汉": ["Bsc", "BTech"] }, "艺术": { "初级" : ["FY", "SY"], "单身汉": ["BA", "B.Ed"] } } }} `; var jcontent = JSON.parse(文本); document.getElementById('output').innerHTML += jcontent; document.getElementById('output2').innerHTML += JSON.stringify(jcontent, 0, 2);
  • @Harsh 我知道我的脚本会显示什么,只需点击运行即可。对于您评论的第一部分,我不明白您的意思。 您希望看到什么?
  • 请注意,“JSON 对象”没有意义(尽管通常说):JSON 是 一个字符串,需要解析成一个对象 让您检索 vales。是否要迭代对象?
  • 如果你的意思是你的原始字符串没有解析成一个对象:不,它不会,因为它不是每个人都说的有效 JSON。非常仔细地阅读上面的 JSON 字符串的构造方式,并将其与您在示例中的内容以及我概述的要点进行比较。您需要将您的字符串包装在一对额外的 {} 中,然后是 JSON.parse() 。一旦你有了它,只需像任何其他对象一样访问它。我会更新一个例子。
  • 没问题。我更新了另一个访问它的示例。
【解决方案2】:

您的 json 格式无效。您不应该在 javascript 字符串中使用多行,并且引号必须转换为双引号。像这样;

var text = '{"college":{"stream":{"commerce":{"junior":["FY","SY"],"bachelor":["Bcom","BMM"]},"science":{"junior":["FY","SY"],"bachelor":["Bsc","BTech"]},"arts":{"junior":["FY","SY"],"bachelor":["BA","B.Ed"]}}}}';
JSON.parse(text);

您还可以使用在线 Json 验证器网站验证您的 json。喜欢this

【讨论】:

  • 这对现有答案没有任何帮助,也没有解决代码 OP 呈现的其他问题。
猜你喜欢
  • 1970-01-01
  • 2014-06-12
  • 1970-01-01
  • 1970-01-01
  • 2011-10-09
  • 1970-01-01
  • 1970-01-01
  • 2017-06-20
相关资源
最近更新 更多