我有一个名为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请求成功完成,对象更新。
答案 0 :(得分:5)
您不需要包含字符串的单引号 - 这些仅在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'
]);
或者更好的是直接从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\"}}"