Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将JSON作为post的参数值发送_Javascript_Ruby_Ajax_Json_Sinatra - Fatal编程技术网

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的服务器端

以下是我试图实现的目标:

  • 用户在textarea元素中输入JSON

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

    myObject = $.parseJSON($("#my-textarea").val());
    
  • JSON通过ajax post请求发送到服务器,并带有

    dataType: json,
    data: {"my_object": myObject}
    
  • Post参数在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
    
    试试这个

    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负载)。但这取决于服务器期望接收的内容。我知道在某些情况下,如果不将对象字符串化,它将转换为名称/值对,但我仍然不清楚它对对象执行什么操作的确切时间。我几乎总是把它串起来,因为它能工作。