[javascript] 문자열이 JSON인지 테스트하는 방법?

간단한 AJAX 호출이 있으며 서버는 유용한 데이터가 포함 된 JSON 문자열 또는 PHP 함수에서 생성 된 오류 메시지 문자열을 반환합니다 mysql_error(). 이 데이터가 JSON 문자열인지 또는 오류 메시지인지 테스트하려면 어떻게해야합니까?

isJSON함수 instanceof를 사용하여 무언가가 Array인지 테스트 하는 것처럼 호출되는 함수를 사용하는 것이 좋습니다 .

이것이 내가 원하는거야:

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



답변

JSON.parse 사용

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


답변

이 코드는 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 테스트 결과


답변

이것을 다시 한 번 살펴 보겠습니다 (2019+ 이상).

인수 : 값은 같은 true, false, nullJSON 유효 (?)

사실 :이 프리미티브 값은 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으로 응답하는 경우 application/json컨텐츠 유형이 있고 일반 텍스트 메시지로 응답하는 경우 컨텐츠 유형이 있어야 text/plain합니다. 서버가 올바른 컨텐츠 유형으로 응답하는지 확인하고 테스트하십시오.


답변

jQuery $.ajax()응답을 사용할 때 responseJSON응답이 JSON 인 경우 속성 을 가지므로 다음과 같이 확인할 수 있습니다.

if (xhr.hasOwnProperty('responseJSON')) {}


답변

나는 가장 좋은 대답을 좋아하지만 빈 문자열이면 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;
}


답변

var parsedData;

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

그러나 귀하의 http 통화 / 서비스는 항상 동일한 형식의 데이터를 반환해야한다고 제안합니다. 따라서 오류가있는 경우이 오류를 래핑하는 JSON 객체가 있어야합니다.

{"error" : { "code" : 123, "message" : "Foo not supported" } } 

HTTP 상태뿐만 아니라 5xx 코드도 사용할 수 있습니다.