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

Ara*_*ras 11 javascript rest json

我有一个javascript对象blocki,我希望使用rest API进行序列化和更新.所以我打电话给:

JSON.stringify(blocki)
Run Code Online (Sandbox Code Playgroud)

这给了我这个字符串:

"{"name":"Updated Blocki","bounds":{"x":"2em","y":"2em","w":"8em","h":"12em"}}"
Run Code Online (Sandbox Code Playgroud)

这几乎是我需要的,除了双引号字符串外面应该有单引号,如下所示:

'{"name":"Updated Blocki","bounds":{"x":"2em","y":"2em","w":"8em","h":"12em"}}'
Run Code Online (Sandbox Code Playgroud)

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

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

'{"name":"Updated Blocki","bounds":{"x":"2em","y":"2em","w":"8em","h":"12em"}}'
Run Code Online (Sandbox Code Playgroud)

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

编辑:我认为我需要这样做的原因是,当字符串用双引号括起来时,我正在使用的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'
Run Code Online (Sandbox Code Playgroud)

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

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'
Run Code Online (Sandbox Code Playgroud)

put请求成功完成,对象更新.

Fab*_*tté 5

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

双引号是Firefox和Chrome倾向于在控制台中表示字符串文字的方式。


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

"{"name":"Updated Blocki","bounds":{"x":"2em","y":"2em","w":"8em","h":"12em"}}"
Run Code Online (Sandbox Code Playgroud)

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

  • 另外,开发控制台不会在控制台中输出转义字符,因此通常会看到`“ {” foo“:” bar“}”`,这在JS源代码中实际上是无效的。 (3认同)

Aln*_*tak 5

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

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

编辑 - 自从我写完以上内容之后你就编辑了这个问题.

简单的答案是,如果你必须自己用单引号包装字符串,只需使用:

var json = "'" + JSON.stringify(obj) + "'"
Run Code Online (Sandbox Code Playgroud)

更长的答案仍然是你根本不应该包装字符串.将整个命令行传递给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'
]);
Run Code Online (Sandbox Code Playgroud)

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