Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.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
Jquery ajax请求中的json无效_Jquery_Marathon - Fatal编程技术网

Jquery ajax请求中的json无效

Jquery ajax请求中的json无效,jquery,marathon,Jquery,Marathon,目标是成功地将新作业发布到MarathonRESTAPI。我正在使用jqueryv1.12.4 下面的代码从表单中获取值,并将有效的json打印到console.log。我已经用JSONLint验证过了。但它似乎没有到达服务器。下面是打印到日志中的JSON,我在firebug中看到: {"id":"basic-0","cpus":"0.1","mem":"32","instances":"1","cmd":"while [ true ] ; do echo 'Hello Marathon' ;

目标是成功地将新作业发布到MarathonRESTAPI。我正在使用jqueryv1.12.4

下面的代码从表单中获取值,并将有效的json打印到console.log。我已经用JSONLint验证过了。但它似乎没有到达服务器。下面是打印到日志中的JSON,我在firebug中看到:

{"id":"basic-0","cpus":"0.1","mem":"32","instances":"1","cmd":"while [ true ] ; do echo 'Hello Marathon' ; sleep 5 ; done"}
{"message":"Invalid JSON","details":[{"path":"/instances","errors":["error.expected.jsnumber"]},{"path"
:"/cpus","errors":["error.expected.jsnumber"]},{"path":"/mem","errors":["error.expected.jsnumber"]}]
}
我收到了400个错误的请求,然后我看到了这个疯狂的响应(在firebug中):

我不知道这个回答是什么意思。它是来自jQuery还是服务器?有人知道从javascript调用marathon REST API的工作示例吗

这是密码。是的,我知道在请求中传递用户名和密码是非常糟糕的做法,但我还没有弄清楚如何使用基本身份验证,还没有弄清楚如何在marathon Web服务器上启用SSL。婴儿步

var $form = $('#appsubmit1');

$form.submit(function() {
    var form2json = JSON.stringify($('form').serializeObject());
    console.log(form2json);
    $.ajax({
      type: 'POST',
      url: 'https://user:pass@mesos-head.achillesv.net/marathon/v2/apps',
      data: form2json,
      dataType: 'json',
      contentType: "application/json; charset=utf-8",
      timeout: 10000 
    }).done(function(resp, status, xhr) { 
      console.log("ajax function done: ", status);
    }).fail(function(xhr, status, errmsg) { 
      console.log("error: ", status); 
      console.log("error: ", errmsg); 
    });      
    return false;
  });
下面是serializeObject函数的代码,我没有编写它,但在网上找到了它。它工作得很好,只是它双引号引用了所有的值。我需要取消引用数值。不幸的是,我看不到代码将双引号放在哪里,因此我不知道如何将它们去掉。我还在努力

$.fn.serializeObject = function() {
    var o = {};
    var a = this.serializeArray();
    $.each(a, function() {
      if (o[this.name] !== undefined) {
        if (!o[this.name].push) {
            o[this.name] = [o[this.name]];
        }
        o[this.name].push(this.value || '');
      } else {
        o[this.name] = this.value || '';
      }
    });
    return o;
  };

我正在考虑检查每个this.value与一个regexp,如果该值是完全数字的,则该regexp会删除引号,即0.1、3、200.5,等等。当我弄明白的时候,我会发布这个消息,因为我认为其他人肯定也有这个问题。

错误清楚地表明,服务需要一个数字而不是字符串来表示
CPU
mem
实例
字段。尝试使用此json发布:

{
    "id": "basic-0",
    "cpus": 0.1,
    "mem": 32,
    "instances": 1,
    "cmd": "while [ true ] ; do echo 'Hello Marathon' ; sleep 5 ; done"
}

你为什么要费尽心机去做
var form2json=JSON.stringify($('form').serializeObject())。。。数据:form2json
当您只需执行
数据:$(“form”).serialize()
?这可能会解决您预期的整数问题,因为它不会在预处理过程中对所有表单数据进行字符串化。

我自己发现了问题,并回来回答我自己的问题。但谢谢阿基斯和乔纳森。Jonathan,我将尝试serializeObject,但我了解到它(或serializeArray)没有处理所有各种形式的可能性,如复选框等。我希望你是对的。Akis的回答基本上是正确的,但没有给你一个特定的解决方案。jQuery的
serialize()
最常用于为AJAX获取表单数据。您只希望出于您当时知道的特定原因使用替代方案。无论如何,谢谢你的支持票。jQuery中没有
serializeObject()
,因此我假设您正在为此使用一些插件,我不确定您从哪里听说它不能像我的经验那样处理所有各种可能性。唯一的问题是边缘情况,您可能希望复选框发送未检查的值。但这是因为它们只在选中时提交一个值。在本例中,它不处理“mem”、“cpu”和“instances”字段中的数值,而是将它们放在双引号中。但这就是问题所在。我需要JSON使数值不带引号。当我按照Akis的回答做时,它起了作用。但是,即使是serializeObject函数(我在SO的某个地方找到)也不能解决这个问题。我已经将serializeObject函数代码添加到我的原始帖子中,因为它不允许我在这里添加它。要明确的是,这段代码并不能解决我的问题,因为它引用了所有的值,而我需要不引用的数字字段。