11

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

我构造了这个对象

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

但是当我尝试使用 JSON.parse(jstr1) 进行解析时,出现以下错误。看截图。

在此处输入图像描述

但是当我尝试解析这个

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

我成功了,看截图。我对此感到困惑。请解释我为什么会发生这种情况。这两种形式有什么区别。

当我从任何服务获得 JSON 作为响应时,它会是什么样子,无论是形式jstr还是jstr1

提前感谢您的帮助。

4

5 回答 5

30

您正在创建一个 Javascript Object。如果您想要其中的 JSON 字符串,请使用JSON.stringify.

所以

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

基于评论:没有JSON Object这样的东西。有 JSON 字符串,可以是parsedJavascript 对象。Javascript 对象可以是stringifiedJSON 字符串。在 JSON 字符串中,键和值被引用。所以上面的结果是一个包含'{"mykey":"my value"}'.

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

于 2013-09-05T11:34:23.153 回答
6

这段代码

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

使用Object Literal Notation创建一个 JavaScript 对象。
有关Object Literal NotationJSON(JON 是JavaScript object notation的缩写)之间的区别,请参见此处:JSON 和 Object Literal Notation 之间的区别是什么?

将此数据传递给JSON.parse().

您的第一个变体 ( var jstr = '{"mykey": "my value"}';) 的不同之处在于它创建了一个“原始”字符串。除了原始字符序列外,您无法访问该字符串上的任何内容。UsingJSON.parse()为我们提供了一个从字符串创建的可用表单(对象)。

SyntaxError: Unexpected token o

这来自以下的自动字符串转换jstr1

jstr1.toString();
// gives us [object Object]
// ----------↑
于 2013-09-05T11:31:03.657 回答
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

于 2013-09-05T11:37:41.347 回答
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 字符串)

于 2013-09-05T11:42:20.290 回答
-8

这个怎么样:

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"}

于 2014-04-24T15:19:34.067 回答