这就是我想要完成的事情:
用户在textarea元素中输入JSON。
{
"test":[
{"a":"b"}
]
}
客户端JavaScript解析JSON。
myObject = $.parseJSON($("#my-textarea").val());
通过ajax post请求将JSON发送到服务器
dataType: json,
data: {"my_object": myObject}
在sinatra的服务器端检查发布参数,JSON现在看起来像这样。
{
"test": {
"0": {
"a": "b"
}
}
}
我想知道为什么测试数组被改成了哈希,如果我有什么办法可以避免这种情况。我认为原始的JSON格式不正确,但我不确定。
编辑: 这是ajax请求和控制器操作的精简版本。
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
答案 0 :(得分:1)
试试这个
var test = "{ \"test\":[{\"a\":\"b\"}]}"
$.parseJSON(test) // or even JSON.parse(test)
如果在对象进入服务器端之前跟踪对象,则会确认它已正确解析。所以问题出在sinatra我会说。
在执行服务器调用之前,首先检查解析结果是什么。
如果您不知道您的客户端是否正在进行错误的翻译,请创建一个原生的javascript对象(没有解析)并发送它。如果它仍然不好,我怀疑问题是在客户端。
我在chrome控制台上输出了输出:
JSON.parse(test)
Object {test: Array[1]}
test: Array[1]
0: Object
答案 1 :(得分:1)
我会在发送之前对生成的JSON对象进行字符串化,如下所示:
dataType: json,
data: {"my_object": JSON.stringify(myObject)}
如果您必须支持本机没有JSON的浏览器,您可以有条件地导入json js以添加该支持。 (jQuery本身没有JSON stringify方法)。