19

我有一个名为的 javascript 对象blocki,我想使用 REST API 对其进行序列化和更新。所以我打电话:

JSON.stringify(blocki)

这给了我这个字符串:

"{"name":"Updated Blocki","bounds":{"x":"2em","y":"2em","w":"8em","h":"12em"}}"

这几乎是我需要的,除了双引号字符串应该在外面有单引号,就像这样:

'{"name":"Updated Blocki","bounds":{"x":"2em","y":"2em","w":"8em","h":"12em"}}'

根据MDN JSON.stringify上的示例,它应该返回一个用单引号括起来的字符串。但是当我在该页面中尝试相同的示例时,我得到了用双引号括起来的字符串。例如,当我输入JSON.stringify({})Firefox 和 chrome 控制台时,我返回"{}"而不是'{}'.

如何正确序列化我的 Javascript 对象,以便外部引号是:'。同样,这个字符串是我想要实现的一个例子:

'{"name":"Updated Blocki","bounds":{"x":"2em","y":"2em","w":"8em","h":"12em"}}'

理想情况下,我想学习一种序列化对象的好方法,而不必在序列化后修改字符串。

编辑:我认为我需要这样做的原因是,当字符串用双引号引起来时,我正在使用的 API 不知何故不高兴。例如,当我这样做时

curl -i -H "Accept: application/json" -H "Content-type: application/json" -X PUT -d "{"name":"Updated Blocki","bounds":{"x":"2em","y":"2em","w":"8em","h":"12em"}}" 'http://localhost:3000/api/blockies/17'

请求失败,服务器给出解析错误。但是,当我尝试:

curl -i -H "Accept: application/json" -H "Content-type: application/json" -X PUT -d '{"name":"Updated Blocki","bounds":{"x":"2em","y":"2em","w":"8em","h":"12em"}}' 'http://localhost:3000/api/blockies/17'

put 请求成功通过并更新对象。

4

5 回答 5

8

您不需要那些包裹字符串的单引号 - 这些仅在 MDN 页面上用于显示与输出对应的字符串文字。

引号不是字符串本身内容的一部分!

编辑- 自从我写了上面的内容以来,你已经编辑了这个问题。

简单的答案是,如果您绝对必须自己将字符串用单引号括起来只需使用:

var json = "'" + JSON.stringify(obj) + "'"

更长的答案仍然是您根本不应该包装字符串。将整个命令行传递给 shell 被认为是不好的做法 - 某些环境变量(尤其是IFS)的存在会改变命令行的解释方式,从而导致安全问题。

由于您使用的是 Javascript,我猜您可能正在使用nodejschild_process模块?如果是这样,您应该使用.spawn而不是.exec,并将参数作为数组传递。当以这种方式传递时,参数会直接传递到 Curl 的argv数组中,而无需首先由 shell 解析,因此根本不需要引用,例如:

var child = spawn('curl', [
    '-i', '-H', 'Accept: application/json',
    '-H', 'Content-type: application/json', 
    '-X', 'PUT',
    '-d', json,
    'http://localhost:3000/api/blockies/17'
]);

或者更好的是直接从 Node 进行 PUT 调用,而不使用 Curl。

于 2012-11-05T21:50:25.570 回答
5

除了由方法自动完成的转义之外,用单引号或双引号括起来的字符串之间没有区别JSON.stringify。包裹字符串文字的单/双引号不是字符串本身的一部分。

双引号是 Firefox 和 Chrome 更喜欢在控制台中表示字符串文字的方式。


编辑:现在使用 CURL 命令它完全改变了问题的含义。

"{"name":"Updated Blocki","bounds":{"x":"2em","y":"2em","w":"8em","h":"12em"}}"

上面的字符串不是有效的字符串,因为您不能在双引号包裹的字符串中包含未转义的双引号。

于 2012-11-05T21:49:47.573 回答
2

您所看到的只是控制台如何打印字符串的产物。

也就是说,在 Chrome 的控制台中试试这个以获得乐趣......

JSON.parse(
  JSON.stringify(
    JSON.parse(
      JSON.stringify(
        JSON.parse(
          '{"name":"Updated Blocki","bounds":{"x":"2em","y":"2em","w":"8em","h":"12em"}}'
))))).name
于 2012-11-05T21:50:29.290 回答
2

例如,当我在 Firefox 和 chrome 控制台中键入 JSON.stringify({}) 时,我会返回“{}”而不是“{}”。

这就是字符串在控制台中的显示方式。它实际上不是"{}"一个包含{}. 引号只是表示它是一个字符串。尝试在 Chrome 控制台中输入“”,您就会明白我的意思。

于 2012-11-05T21:51:02.360 回答
1

周围的单/双引号只是表明它是一个字符串,它不是实际字符串数据的一部分并且不能存储。

var serializedData = JSON.stringify({"name":"Updated Blocki","bounds":{"x":"2em","y":"2em","w":"8em","h":"12em"}});
var deserializedData = JSON.parse(serializedData);  // whether console displays the serializedData String with single or double quotes is irrelevant

如果您要存储字符串并将其输出到客户端,请用单引号将其包裹起来。

使用 curl 时,有什么东西可以阻止你用单引号括起来吗?

如果您坚持用双引号括起来,则必须像这样转义字符串中的双引号:

"{\"name\":\"Updated Blocki\",\"bounds\":{\"x\":\"2em\",\"y\":\"2em\",\"w\":\"8em\",\"h\":\"12em\"}}"
于 2012-11-05T22:00:50.217 回答