2016-07-07 52 views
0

我试图发送一个JQuery请求到我正在做的API(第一次,学习!),但我的PHP代码报告JSON格式不正确。当从JQuery发送到PHP时格式不正确JSON

如果我在PHP中创建一个JSON数组,并通过它可以正常工作,但如果我尝试通过JQuery请求它总是说格式不正确。

我卡住了!

JavaScript端看起来像这样...

jsonrequest = "{request: 'getJobs', token : 'eb024fab2bf6a1bfb5863dcaabcfd63fcaea50e429237df3f1cbcbfcf9b2'}"; 
    $.ajax({ 
    url: 'api.php', 
    async: true, 
    dataType: 'json', 
    contentType: "application/json; charset=utf-8", 
    data: jsonrequest, 


     success: function (result) { 
      console.log(result); 
     } 
}); 

和PHP看起来像这样

$data  = file_get_contents("php://input"); 

if(isJson($data)) { 

     // never passes the isJSON validation. 

     $json  = json_decode($data,true); 
     $request = sanitize($json['request']); 
     } 


function isJSON($string) 
{ 
    // decode the JSON data 
    $result = json_decode($string); 

    // switch and check possible JSON errors 
    switch (json_last_error()) { 
     case JSON_ERROR_NONE: 
      $error = ''; // JSON is valid // No error has occurred 
      break; 
     case JSON_ERROR_DEPTH: 
      $error = 'The maximum stack depth has been exceeded.'; 
      break; 
     case JSON_ERROR_STATE_MISMATCH: 
      $error = 'Invalid or malformed JSON.'; 
      break; 
     case JSON_ERROR_CTRL_CHAR: 
      $error = 'Control character error, possibly incorrectly encoded.'; 
      break; 
     case JSON_ERROR_SYNTAX: 
      $error = 'Syntax error, malformed JSON.'; 
      break; 
     // PHP >= 5.3.3 
     case JSON_ERROR_UTF8: 
      $error = 'Malformed UTF-8 characters, possibly incorrectly encoded.'; 
      break; 
     // PHP >= 5.5.0 
     case JSON_ERROR_RECURSION: 
      $error = 'One or more recursive references in the value to be encoded.'; 
      break; 
     // PHP >= 5.5.0 
     case JSON_ERROR_INF_OR_NAN: 
      $error = 'One or more NAN or INF values in the value to be encoded.'; 
      break; 
     case JSON_ERROR_UNSUPPORTED_TYPE: 
      $error = 'A value of a type that cannot be encoded was given.'; 
      break; 
     default: 
      $error = 'Unknown JSON error occured.'; 
      break; 
    } 

    if ($error !== '') { 
     // throw the Exception or exit // or whatever :) 
     $output = array('status' => "error",'message' => $error); 
     echo json_encode($output); 
     exit; 
    } 

    // everything is OK 
    return $result; 
} 
+0

JSON在对象键上也需要引号。 –

回答

2

尝试

data: {request: 'getJobs', token: 'eb024fab2bf6a1bfb5863dcaabcfd63fcaea50e429237df3f1cbcbfcf9b2'} 

的周围没有引号。 jQuery应该为你处理。

如果仍然失败,可以在开发人员工具中打开它,查看ajax请求并查看数据实际上看起来像什么以获取想法。

+0

这反映了我要完全回应的内容。这可能是html编码的输入字符串。 –

+0

我已经把报价放在了上面,但没有什么区别,我没有意识到开发者工具会告诉我这个外向的请求。很酷的功能...在网络部分是这个'api.php?request = getJobs&token = eb024fab2bf6a1bfb5863dcaabcfd63fcaea50e429237df3f1cbcbfcf9b2'这是否意味着它作为一个标准的GET类型的请求而不是编码的JSON? –

+0

@CraigArmitage是的,这是一个GET请求,您可以使用$ .post()或者包含'method:“POST”'作为$ .ajax()中的一个属性。 http://api.jquery.com/jquery.ajax/ – neilsimp1

1

您的代码

jsonrequest = "{request: 'getJobs', token : 'eb024fab2bf6a1bfb5863dcaabcfd63fcaea50e429237df3f1cbcbfcf9b2'}"; 

要定义jsonrequest作为一个字符串不是一个对象。

尝试以下两种情况之一(注意键名在引号被包裹得)

jsonrequest = {'request': 'getJobs', 'token' : 'eb024fab2bf6a1bfb5863dcaabcfd63fcaea50e429237df3f1cbcbfcf9b2'}; 

,或者如果jsonrequest具有内置因为你可以使用jQuery.parseJSON()

字符串
jsonrequest = '{"request": "getJobs", "token" : "eb024fab2bf6a1bfb5863dcaabcfd63fcaea50e429237df3f1cbcbfcf9b2"}'; 
jsonrequest = $.parseJSON(jsonrequest); 
+0

感谢您的意见,但遗憾的是PHP方面仍然存在格式错误。 –

+0

即使在密钥周围添加了引号?你能记录传递给PHP端的字符串吗?那将是首先检查哪部分是无效的JSON。 –