[javascript] Try / Catch를 사용하지 않고 문자열이 JavaScript에서 유효한 JSON 문자열인지 확인하는 방법

다음과 같은 것 :

var jsonString = '{ "Id": 1, "Name": "Coke" }';

//should be true
IsJsonString(jsonString);

//should be false
IsJsonString("foo");
IsJsonString("<div>foo</div>")

솔루션에는 try / catch가 포함되어서는 안됩니다. 우리 중 일부는 “모든 오류 발생”을 설정하고 디버거가 잘못된 JSON 문자열을 중단하는 것을 좋아하지 않습니다.



답변

먼저 코멘트. 질문은를 사용하지 않는 것에 관한 것 try/catch입니다.
사용하지 않으려면 아래 답변을 읽으십시오. 여기서는 JSON정규 표현식을 사용하여 문자열을 확인하면 모든 경우가 아니라 대부분의 경우 작동합니다.

https://github.com/douglascrockford/JSON-js/blob/master/json2.js 에서 450 줄을 둘러보십시오.

유효한 JSON을 확인하는 정규 표현식이 있습니다.

if (/^[\],:{}\s]*$/.test(text.replace(/\\["\\\/bfnrtu]/g, '@').
replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {

  //the json is ok

}else{

  //the json is not ok

}

편집 : json2.js의 새로운 버전은 위의 것보다 더 고급 구문 분석을 수행하지만 여전히 정규 표현식 대체를 기반으로합니다 ( @Mrchief의견에서 )


답변

다음과 같은 JSON 파서를 사용하십시오 JSON.parse.

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


답변

나는이 질문에 3 년 늦었다는 것을 안다.

Gumbo의 솔루션은 훌륭하게 작동하지만 예외가 발생하지 않는 몇 가지 경우를 처리하지 않습니다. JSON.parse({something that isn't JSON})

또한 구문 분석 된 JSON을 동시에 반환하는 것을 선호하므로 호출 코드는 JSON.parse(jsonString)두 번째 호출 할 필요가 없습니다 .

이것은 내 요구에 잘 맞는 것 같습니다.

function tryParseJSON (jsonString){
    try {
        var o = JSON.parse(jsonString);

        // Handle non-exception-throwing cases:
        // Neither JSON.parse(false) or JSON.parse(1234) throw errors, hence the type-checking,
        // but... JSON.parse(null) returns null, and typeof null === "object", 
        // so we must check for that, too. Thankfully, null is falsey, so this suffices:
        if (o && typeof o === "object") {
            return o;
        }
    }
    catch (e) { }

    return false;
};


답변

// vanillaJS
function isJSON(str) {
    try {
        return (JSON.parse(str) && !!str);
    } catch (e) {
        return false;
    }
}

사용법 : isJSON({})false, isJSON('{}')될 것입니다 true.

무언가가 ( 구문 분석 된 JSON) Array인지 확인하려면 다음을 수행하십시오 .Object

// vanillaJS
function isAO(val) {
    return val instanceof Array || val instanceof Object ? true : false;
}

// ES2015
var isAO = (val) => val instanceof Array || val instanceof Object ? true : false;

사용법 : isAO({})true, isAO('{}')될 것입니다 false.


답변

여기 내 작업 코드 :

function IsJsonString(str) {
  try {
    var json = JSON.parse(str);
    return (typeof json === 'object');
  } catch (e) {
    return false;
  }
}


답변

문자열이 유효한 JSON인지 여부를 확인하는 간단한 방법을 사용했습니다.

function testJSON(text){
    if (typeof text!=="string"){
        return false;
    }
    try{
        JSON.parse(text);
        return true;
    }
    catch (error){
        return false;
    }
}

유효한 JSON 문자열이있는 결과 :

var input='["foo","bar",{"foo":"bar"}]';
testJSON(input); // returns true;

간단한 문자열로 결과;

var input='This is not a JSON string.';
testJSON(input); // returns false;

객체 결과 :

var input={};
testJSON(input); // returns false;

널 입력 결과 :

var input=null;
testJSON(input); // returns false;

널 변수의 유형이 오브젝트이므로 마지막 값은 false를 리턴합니다.

이것은 매번 작동합니다. 🙂


답변

prototypeJS에는 isJSON 메소드가 있습니다 . 시도해 볼 수 있습니다. json 조차도 도움이 될 수 있습니다.

"something".isJSON();
// -> false
"\"something\"".isJSON();
// -> true
"{ foo: 42 }".isJSON();
// -> false
"{ \"foo\": 42 }".isJSON();