如何将我的序列化JSON字符串包装在“单引号”中

时间:2012-11-05 21:47:12

标签: javascript json rest

我有一个名为blocki的javascript对象,我想使用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上的示例,它应该返回一个用单引号括起来的字符串。但是,当我在该页面中尝试相同的示例时,我将字符串包装在双引号中。例如,当我在Firefox和Chrome控制台中键入JSON.stringify({})时,我会返回"{}"而不是'{}'

如何正确序列化我的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请求成功完成,对象更新。

5 个答案:

答案 0 :(得分:5)

您不需要包含字符串的单引号 - 这些仅在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。

答案 1 :(得分:4)

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

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


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

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

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

答案 2 :(得分: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

答案 3 :(得分:2)

  

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

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

答案 4 :(得分: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\"}}"