我有一个名为 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 请求成功通过,对象被更新。
最佳答案
您不需要用单引号将字符串括起来 - 它们仅在 MDN 页面上用于显示与输出相对应的字符串文字。
引号不是字符串本身内容的一部分!
编辑 - 自从我写完以上内容后,您已经编辑了问题。
简单的答案是,如果您绝对必须将字符串用单引号括起来您自己,只需使用:
var json = "'" + JSON.stringify(obj) + "'"
较长的答案仍然是您根本不应该包装字符串。将整个命令行传递给 shell 被认为是不好的做法 - 某些环境变量(尤其是 IFS
)的存在会改变命令行的解释方式,从而导致安全问题。
由于您使用的是 Javascript,我猜您可能正在使用 nodejs
和 child_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'
]);
或者更好的是不使用 Curl 直接从 Node 进行 PUT 调用。
关于javascript - 如何将序列化的 JSON 字符串包装在 'single quotes' 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13240930/