带引号或不带引号的JSON对象

11

我正在尝试学习JSON,我了解到任何带有双引号键的JavaScript对象都被视为JSON对象。

我构建了这个对象

var jstr1 = {"mykey": "my value"};

但是当我尝试使用JSON.parse(jstr1)进行解析时,我遇到了以下错误。请参见屏幕截图。

在此输入图片描述

但是当我尝试解析这个时

var jstr = '{"mykey": "my value"}';,

我成功了,看屏幕截图。我很困惑,请解释一下为什么会这样。这两个表单有什么区别。

当我从任何服务中获得JSON响应时,它会是什么样子,是jstr还是jstr1的形式呢?

非常感谢您提供的任何帮助。


正如@ComFreek所说,如果您已经有了“Hash”,那么您希望从解析中获得什么? - fguillen
1
第一个是对象。第二个是字符串,确切地说是JSON。JSON.parse适用于字符串,而不是对象。 - user568109
5个回答

34

您正在创建一个 JavaScript Object。如果您想从中获得一个 JSON-string,请使用 JSON.stringify

因此,

const myObj = {mykey: "my value"};
const myObjJSON = JSON.stringify(myObj);

根据评论: 没有所谓的JSON对象。有可以被解析成Javascript对象的JSON字符串。Javascript对象可以被序列化成JSON字符串。在JSON字符串中,键和值被引用。因此上面的结果是一个包含'{"mykey":"my value"}'字符串

尝试在您的浏览器控制台中解析myObjJSON(使用:JSON.parse(myObjJSON)),您将获得:Object {mykey: "my value"}


尽管按照JSON标准,mykey没有用双引号括起来,但在您的答案中,它被转换为JSON字符串:"var myObj = {mykey: "my value"}"。当我使用mykey对对象进行stringify时,无论是否使用引号,我都得到了相同的结果。 - Mohamed Hussain
@MohamedHussain 在JavaScript中,键名不必用双引号括起来。 - ComFreek
@ComFreek 你是正确的。键不需要用引号括起来,但对于 JSON,键需要用双引号括起来。我从 https://dev59.com/VnE85IYBdhLWcg3wMAbc?lq=1 学到了这一点。 - Mohamed Hussain
@Kooilnc:感谢提到没有JSON对象。普通的JavaScript对象可以被转换为JSON字符串。 如果普通的JavaScript对象键在转换为JSON字符串时没有双引号,那么JSON字符串中会添加双引号。 如果引号已经存在,当从JavaScript对象转换为JSON字符串时也会产生相同的结果。 - Mohamed Hussain
1
@DenukaNirmalee 不确定你的意思,但是你可以使用替换函数,类似于 JSON.stringify({ "year": "2019", "month": "2", "day": "26" }, (key, value) => !isNaN(+value) ? +value : value) - KooiInc
显示剩余6条评论

6
这段代码
var jstr1 = {"mykey": "my value"};

使用对象字面量创建JavaScript对象。
关于对象字面量JSON(JON是JavaScript对象表示法的缩写)之间的区别,请参见此处:什么是JSON和对象字面量之间的区别?

将这些数据传递给 JSON.parse() 没有任何意义。

与您的第一个变量(var jstr = '{"mykey": "my value"}';)的区别在于它创建了一个“原始”字符串。您不能访问该字符串上除原始字符序列之外的任何内容。使用JSON.parse()为我们提供了从字符串创建的可用形式(对象)。

SyntaxError: 意外的令牌o

这来自于jstr1的自动字符串转换:

jstr1.toString();
// gives us [object Object]
// ----------↑

6

您对于JSON.parse存在一些误解。

JSON.parse takes string and parse it to JAVASCRIPT object
JSON.stringify takes an object and parse it to a string

这就是为什么在运行以下命令时:
JSON.parse('{"a":"b"}')

它之所以能够工作,是因为它期望一个JSON字符串。

但是当你运行时,

JSON.parse({"a":"b"})

由于该对象被转换为字符串,因此它没有执行。

"[object Object]"

以下是出错信息,其中"[object Object]"在字母o处不是有效的语法:


2

JSON.parse()可以接受一个字符串并将其转换为JSON对象,但不能将JavaScript对象作为参数。请参考JSON.parse()。它可以返回以下结果:

JSON.parse('{}'); // {}
JSON.parse('true'); // true
JSON.parse('"foo"'); // "foo"
JSON.parse('[1, 5, "false"]'); // [1, 5, "false"]
JSON.parse('null'); // null

请注意,如果要解析的字符串不是有效的JSON格式,则会抛出SyntaxError异常。 这就是您在jstr1上获取语法错误的方式(它不是一个JSON字符串)


-9
这个怎么样?
MarahJSONObject gtp = new MarahJSONObject()
    gtp.put("ecomm_prodid", "123")
    gtp.put("ecomm_pagetype", "cart")
    gtp.put("ecomm_totalvalue", "19.99")

String r = gtp.toString()
    gtp.keySet().each {
        r = r.replace(/"${it}"/, it)
    }
    println r

然后你会得到: {ecomm_pagetype:“cart”,ecomm_prodid:“123”,ecomm_totalvalue:“19.99”}


这是什么鬼??我看不出来它如何解决手头的问题。 - Frogboxe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接