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请求成功完成,对象更新.
用单引号或双引号引起来的字符串之间没有区别,除了转义是由JSON.stringify方法自动完成的。包装字符串文字的单引号/双引号不属于字符串本身。
双引号是Firefox和Chrome倾向于在控制台中表示字符串文字的方式。
编辑:现在使用CURL命令,它将完全改变问题的含义。
"{"name":"Updated Blocki","bounds":{"x":"2em","y":"2em","w":"8em","h":"12em"}}"
Run Code Online (Sandbox Code Playgroud)
上面的字符串不是有效的字符串,因为您不能在双引号引起来的字符串中包含未转义的双引号。
您不需要包含字符串的单引号 - 这些仅在MDN页面上显示与输出对应的字符串文字.
引号不是字符串本身内容的一部分!
编辑 - 自从我写完以上内容之后你就编辑了这个问题.
简单的答案是,如果你必须自己用单引号包装字符串,只需使用:
var json = "'" + JSON.stringify(obj) + "'"
Run Code Online (Sandbox Code Playgroud)
更长的答案仍然是你根本不应该包装字符串.将整个命令行传递给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'
]);
Run Code Online (Sandbox Code Playgroud)
或者更好的是直接从Node进行PUT调用而不使用Curl.
| 归档时间: |
|
| 查看次数: |
23613 次 |
| 最近记录: |