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

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

这就是我想要的:

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

当前回答

让我们回顾一下(2019年以上)。

参数:true, false, null等值是有效的JSON (?)

事实:这些基本值是JSON可解析的,但它们不是格式良好的JSON结构。JSON规范表明JSON构建在两个结构之上:名称/值对的集合(对象)或有序的值列表(数组)。

实参:异常处理不应该用于做预期的事情。 (这是一个有25+赞的评论!)

事实:不!使用try/catch绝对是合法的,特别是在这种情况下。否则,你需要做大量的字符串分析,如标记/正则表达式操作;它的性能会很糟糕。

hasJsonStructure ()

如果您的目标是检查某些数据/文本是否具有正确的JSON交换格式,那么这很有用。

function hasJsonStructure(str) {
    if (typeof str !== 'string') return false;
    try {
        const result = JSON.parse(str);
        const type = Object.prototype.toString.call(result);
        return type === '[object Object]' 
            || type === '[object Array]';
    } catch (err) {
        return false;
    }
}

用法:

hasJsonStructure('true')             // —» false
hasJsonStructure('{"x":true}')       // —» true
hasJsonStructure('[1, false, null]') // —» true

safeJsonParse()

如果在将某些数据解析为JavaScript值时想要小心,这是很有用的。

function safeJsonParse(str) {
    try {
        return [null, JSON.parse(str)];
    } catch (err) {
        return [err];
    }
}

用法:

const [err, result] = safeJsonParse('[Invalid JSON}');
if (err) {
    console.log('Failed to parse JSON: ' + err.message);
} else {
    console.log(result);
}

其他回答

这段代码是JSON.parse(1234)或JSON.parse(0)或JSON.parse(false)或JSON.parse(null)都会返回true。

function isJson(str) {
    try {
        JSON.parse(str);
    } catch (e) {
        return false;
    }
    return true;
}

所以我这样重写了代码:

function isJson(item) {
    item = typeof item !== "string"
        ? JSON.stringify(item)
        : item;

    try {
        item = JSON.parse(item);
    } catch (e) {
        return false;
    }

    if (typeof item === "object" && item !== null) {
        return true;
    }

    return false;
}

测试结果:

isJson测试结果

这是伯恩的回答中有一些小改动的密码。 由于JSON.parse(number)工作正常,没有任何异常,所以添加了isNaN。

function isJson(str) {
    try {
        JSON.parse(str);
    } catch (e) {
        return false;
    }
    return isNaN(str);
}

导出函数isJsonString(value) { 尝试{ return typeof JSON.parse(value) === 'object'; } catch (e) { 返回错误; } }

这为我处理了大部分所需的情况!

让我们回顾一下(2019年以上)。

参数:true, false, null等值是有效的JSON (?)

事实:这些基本值是JSON可解析的,但它们不是格式良好的JSON结构。JSON规范表明JSON构建在两个结构之上:名称/值对的集合(对象)或有序的值列表(数组)。

实参:异常处理不应该用于做预期的事情。 (这是一个有25+赞的评论!)

事实:不!使用try/catch绝对是合法的,特别是在这种情况下。否则,你需要做大量的字符串分析,如标记/正则表达式操作;它的性能会很糟糕。

hasJsonStructure ()

如果您的目标是检查某些数据/文本是否具有正确的JSON交换格式,那么这很有用。

function hasJsonStructure(str) {
    if (typeof str !== 'string') return false;
    try {
        const result = JSON.parse(str);
        const type = Object.prototype.toString.call(result);
        return type === '[object Object]' 
            || type === '[object Array]';
    } catch (err) {
        return false;
    }
}

用法:

hasJsonStructure('true')             // —» false
hasJsonStructure('{"x":true}')       // —» true
hasJsonStructure('[1, false, null]') // —» true

safeJsonParse()

如果在将某些数据解析为JavaScript值时想要小心,这是很有用的。

function safeJsonParse(str) {
    try {
        return [null, JSON.parse(str)];
    } catch (err) {
        return [err];
    }
}

用法:

const [err, result] = safeJsonParse('[Invalid JSON}');
if (err) {
    console.log('Failed to parse JSON: ' + err.message);
} else {
    console.log(result);
}

使用JSON.parse

function isJson(str) {
    try {
        JSON.parse(str);
    } catch (e) {
        return false;
    }
    return true;
}