将JSON作为post的参数值发送

时间:2014-01-31 17:02:12

标签: javascript ruby ajax json sinatra

这就是我想要完成的事情:

  1. 用户在textarea元素中输入JSON。

    {
        "test":[
            {"a":"b"}
        ]
    }       
    
  2. 客户端JavaScript解析JSON。

    myObject = $.parseJSON($("#my-textarea").val());
    
  3. 通过ajax post请求将JSON发送到服务器

    dataType: json,
    data: {"my_object": myObject}
    
  4. 在sinatra的服务器端检查发布参数,JSON现在看起来像这样。

    {
        "test": {
            "0": {
                "a": "b"
            }
        }
    }
    
  5. 我想知道为什么测试数组被改成了哈希,如果我有什么办法可以避免这种情况。我认为原始的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
    

2 个答案:

答案 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方法)。