Javascript 将JSON作为post的参数值发送
以下是我试图实现的目标:Javascript 将JSON作为post的参数值发送,javascript,ruby,ajax,json,sinatra,Javascript,Ruby,Ajax,Json,Sinatra,以下是我试图实现的目标: 用户在textarea元素中输入JSON { "test":[ {"a":"b"} ] } 客户端JavaScript解析JSON myObject = $.parseJSON($("#my-textarea").val()); JSON通过ajax post请求发送到服务器,并带有 dataType: json, data: {"my_object": myObject} Post参数在sinatra的服务器端
{
"test":[
{"a":"b"}
]
}
myObject = $.parseJSON($("#my-textarea").val());
dataType: json,
data: {"my_object": myObject}
{
"test": {
"0": {
"a": "b"
}
}
}
function test() {
return $.ajax({
url: "/test",
type: "post",
dataType: "json",
data: {"test":[{"a":"b"}]},
success: function(response) {
}, error:function(jqXHR,exception) {
ajaxError(jqXHR,exception);
}
})
}
post '/test' do
puts params
return {}
end
试试这个
var test = "{ \"test\":[{\"a\":\"b\"}]}"
$.parseJSON(test) // or even JSON.parse(test)
如果在对象进入服务器端之前跟踪该对象,您将确认该对象已正确解析。我想说,问题出在西纳特拉
在执行服务器调用之前,只需首先检查解析结果
如果您不知道是否是您的客户机进行了错误的翻译,请创建一个本机javascript对象(没有解析),然后发送它。如果情况仍然糟糕,我怀疑问题出在客户身上
我在chrome控制台上获得的输出:
JSON.parse(test)
Object {test: Array[1]}
test: Array[1]
0: Object
在发送之前,我将对生成的JSON对象进行字符串化,如下所示:
dataType: json,
data: {"my_object": JSON.stringify(myObject)}
如果必须支持本机没有JSON的浏览器,则可以有条件地导入JSON js以添加该支持。(jQuery本机没有JSON stringify方法)。没错,它在请求之前被正确解析。更改似乎发生在请求过程中。编辑了我的回答:“如果您不知道是否是您的客户机进行了错误的翻译,请创建一个本机javascript对象(不进行解析)并发送它。如果仍然错误,我怀疑问题出在客户机上。”您可以发布用于进行服务调用的代码吗?服务器端处理它?刚刚将它们添加到原始帖子中。谢谢,我现在可能会将其用作解决方案,但我仍然想知道在请求过程中发生了什么。我的印象是发送对象本身是更好的做法。执行
{“my_object”:JSON.stringify(myObject)}
实际上发送的是一个JSON对象,而不是文本(注意:它在实际的POST中作为文本发送,当然这是POST发送的原因),外部大括号使它成为一个(新的)JSON对象。如果愿意,您也可以不使用键“my_object”而直接执行{JSON.stringify(myObject)}
(许多MVC实现只需要对象,而不是name=object负载)。但这取决于服务器期望接收的内容。我知道在某些情况下,如果不将对象字符串化,它将转换为名称/值对,但我仍然不清楚它对对象执行什么操作的确切时间。我几乎总是把它串起来,因为它能工作。