我有一个简单的AJAX调用,服务器将返回一个带有有用数据的JSON字符串或一个由PHP函数mysql_error()产生的错误消息字符串。如何测试该数据是JSON字符串还是错误消息。

使用一个名为isJSON的函数会很好,就像你可以使用instanceof函数来测试某个东西是否是数组一样。

这就是我想要的:

if (isJSON(data)){
    //do some data stuff
}else{
    //report the error
    alert(data);
}

当前回答

数字和布尔值在json .parse()中被接受为有效的json,只需在解析前添加类型验证

function isJson(str) {

    if(!isNaN(str) || str.toString() == 'true' || str.toString() == 'false'){
        return false;
    }

    try {

        JSON.parse(str);

    } catch (e) {

        return false;

    }

    return true;

}

其他回答

我喜欢最好的答案,但如果它是一个空字符串,它返回真。这里有一个解决方案:

function isJSON(MyTestStr){
    try {
        var MyJSON = JSON.stringify(MyTestStr);
        var json = JSON.parse(MyJSON);
        if(typeof(MyTestStr) == 'string')
            if(MyTestStr.length == 0)
                return false;
    }
    catch(e){
        return false;
    }
    return true;
}

如果服务器响应的是JSON,那么它会有一个application/ JSON内容类型,如果它响应的是纯文本消息,那么它应该有一个文本/纯内容类型。确保服务器响应正确的内容类型并进行测试。

你可以尝试解码它并捕获异常(本机或json2.js):

try {
  newObj = JSON.parse(myJsonString);
} catch (e) {
  console.log('Not JSON');
}

但是,我建议将响应始终设置为有效的JSON。如果你从你的MySQL查询中得到一个错误,简单地发送回JSON错误:

{"error":"The MySQL error string."}

然后:

if (myParsedJSON.error) {
  console.log('An error occurred: ' + myParsedJSON.error);
}

所有json字符串都以'{'或'['开头,并以相应的'}'或']'结尾,所以只需检查一下。

Angular.js是这样做的:

var JSON_START = /^\[|^\{(?!\{)/;
var JSON_ENDS = {
  '[': /]$/,
  '{': /}$/
};

function isJsonLike(str) {
    var jsonStart = str.match(JSON_START);
    return jsonStart && JSON_ENDS[jsonStart[0]].test(str);
}

https://github.com/angular/angular.js/blob/v1.6.x/src/ng/http.js

嗯…这取决于你接收数据的方式。我认为服务器正在响应一个JSON格式 字符串(在PHP中使用json_encode(),例如)。如果你正在使用JQuery post并将响应数据设置为JSON格式,并且它是一个格式错误的JSON,这将产生一个错误:

$.ajax({
  type: 'POST',
  url: 'test2.php',
  data: "data",
  success: function (response){

        //Supposing x is a JSON property...
        alert(response.x);

  },
  dataType: 'json',
  //Invalid JSON
  error: function (){ alert("error!"); }
});

但是,如果你使用类型响应作为文本,你需要使用$. parsejson。根据jquery网站: “传递一个格式错误的JSON字符串可能导致抛出异常”。因此你的代码将是:

$.ajax({
  type: 'POST',
  url: 'test2.php',
  data: "data",
  success: function (response){

        try {
            parsedData = JSON.parse(response);
        } catch (e) {
            // is not a valid JSON string
        }

  },
  dataType: 'text',
});