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


548

다음과 같은 것 :

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

//should be true
IsJsonString(jsonString);

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

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


25
사용하지 말아야 할 유효한 이유가 try있습니까?
Nick T

7
@NickT 디버거에서 "모든 오류 중단"을 설정하면 오류가 발생합니다. Chrome은 이제 잡히지 않은 오류를 차단할 수 있습니다.
Chi Chan

6
try catch로 2 줄만 사용하십시오. var isValidJSON = true; {JSON.parse (jsonString)} 시도 {catch {isValidJSON = false; }
efkan

18
그것이 작동하는 동안, 그것은 끔찍하게 어색하고 나쁜 연습입니다. Try / catch는 일반적인 프로그램 흐름이 아니라 예외적 인 동작 및 오류 처리를위한 것입니다.
Tasgall

7
@Tasgall 일반적으로 그렇습니다. 그러나 try / catch 접근 방식이 유효성 검사기 기반 접근 방식보다 성능이 좋으면 어떻게해야합니까? 대안이 "나쁜 연습"이기 때문에 (때로는 상당히 느린) 옵션을 사용합니까? try / catch 메소드에는 기능상 문제가 없으므로 사용하지 않을 이유가 없습니다. 새로운 프로그래머가 좋은 코딩 표준을 개발하도록하는 것이 중요하지만, 특히 지침이 필요 이상으로 어려운 경우에는 기존 지침에 대한 맹목적인 준수를 강화하지 않는 것이 중요합니다.
Abion47

답변:


172

먼저 코멘트. 질문은를 사용하지 않는 것에 관한 것 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의견에서 )


59
이것은 코드가 평가하기에 안전한지 확인하는 것입니다. 예를 들어 다음 문자열 '2011-6-27'은 해당 테스트를 통과합니다.
SystemicPlural

4
@SystemicPlural, 그렇습니다. 그러나 문제는 try / catch를 사용하지 않는 것에 관한 것입니다
Mic

8
JS 정규 표현식이 필요한 확장명 (재귀 정규 표현식)을 지원하지 않기 때문에 JavaScript에서 정규 표현식으로 문자열이 유효한 JSON인지 테스트 할 수 없습니다. 위 코드는 "{"에서 실패합니다.
Venge

2
@Mic json2.js는 더 이상 간단한 검사를 사용하지 않습니다 (대신 유효한 JSON을 결정하기 위해 4 단계 구문 분석을 사용함). 답변을 수정하거나 삭제하십시오. 접근 방식으로 "JSON을 확인하는 유일한 메커니즘으로 try / catch를 사용하지 않는다"는 잘못된 생각은 없습니다.
Mr.

8
그것이 그에게 도움이된다고해서 몇 년 후에도 같은 질문을하는 우리의 나머지 사람들을 돕는다는 의미는 아닙니다.
McKay

916

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

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

7
고맙지 만 팀과 함께 이것을 실행하고 그들은 try / catch를 사용하지 않는 것을 원합니다. 질문은 새로운 제목과 함께 편집됩니다. 미안합니다.
Chi Chan

4
@trejder : 1이 문자열이 아니기 때문에 "1"로 시도하십시오
Purefan

31
@Gumbo 내 의견은 1,5 살입니다! :] 기억 나지 않습니다. 제가 2 주 전에했던 일과 그 프로젝트를 기억해달라고 요청하십니까? :] 아니, 방법 ... :]
trejder

9
이 답변의 문제점은 문자열이 체크 아웃되고 구문 분석하면 두 번 구문 분석 한 것입니다. 나쁜 구문 분석에서는 false를 반환 할 수 없지만 성공하면 객체를 반환 할 수 있습니까?
Carcigenicate

5
@Carcigenicate 그렇게 할 수 있습니다. 그러나 거짓 으로 JSON.parse("false")평가됩니다 .
Gumbo

445

나는이 질문에 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;
};

9
페이지의 답변 중 가장 강력하고 신뢰할 수 있습니다.
Jonline

28
o && o !== null불필요한입니다.
Aleksei Matiushkin

4
따라서 typeof와 함께 triple-equals를 사용하면 항상 문자열을 반환합니다. :)
Hein Haraldson Berg

5
오래된 게시물 임에도 불구하고 @matth 답변을 보여주는 바이올린 을 올리는 것이 가치가 있다고 생각했습니다. 객체는 유효하지 않습니다. JSON 문자열을 전달해야합니다. 내가 생각하기 시작한 사람에게 유용 할 수 있습니다.
MindVox

2
이 함수는 유효한 json 문자열 이기 때문에 가 undefined아니라 반환해야 합니다. 그리고 falsefalsetryParseJSON("false")tryParseJSON("garbage")
스페어 바이트

54
// 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.


4
null이 유효성 검사를 통과 하므로주의하십시오 .
Farzad YZ

2
return !!(JSON.parse(str) && str);null 값을 차단해야합니다. 이 코드로 답변을 업데이트하겠습니다.
Machado

1
JSON이 객관화 되어 있는지 확인 하여 parse()테스트를 통과하지 못하여 WTF를 유발할 수도 있기 때문에 이것이 가장 좋은 대답 입니다.
not2qubit

30

여기 내 작업 코드 :

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

1
IsJsonString (null); // 참을 반환합니다. typeof str === 'string'
문법

22

문자열이 유효한 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를 리턴합니다.

이것은 매번 작동합니다. :)


1
JSON.parse (null), JSON.parse ( "false")는 오류를 발생시키지 않습니다. 아마도 더 많은 예제가있을 것입니다.
klodoma

네, 맞습니다. 입력이 문자열인지 아닌지를 확인하는 것을 잊었습니다. 그렇다면 입력이있는이 메소드 null는 거짓을 돌려줍니다. 그러나 "false"입력은 유효한 JSON 문자열입니다. 로 구문 분석됩니다 boolean (false). 이제 코드를 더 정확하게 수정합니다.
kukko

15

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

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

9
고맙지 만 프로토 타입 라이브러리를 사용하는 것은 약간 과잉이라고 생각합니다.
Chi Chan

4
네 가지 예를 주었지만 세 가지 결과 만 제공했습니다. 결과는 무엇입니까 "{ foo: 42 }".isJSON()? 경우 false내가 생각으로 (결과는 문서화 기능을 따라야한다), 그것은 거짓 이유, 그 다음 좋은 질문은 무엇입니까? { foo: 42 }완벽하게 유효한 JSON 인 것 같습니다.
trejder

4
@trejder 불행히도 JSON 사양에는 인용 키가 필요합니다.
mikermcneil

4
"2002-12-15".isJSON은 true를 반환하지만 JSON.parse ( "2002-12-15")는 오류를 발생시킵니다.
ychaouche

4
여기에 더 좋은 대답은 프로토 타입 라이브러리에서 해당 기능을 가져 와서 여기에 배치하는 것입니다. 특히 api.prototypejs.org/language/string/prototype/isjson 이 404 이기 때문에
jcollum

5

프로토 타입 프레임 워크 String.isJSON정의 에서

/**
   *  String#isJSON() -> Boolean
   *
   *  Check if the string is valid JSON by the use of regular expressions.
   *  This security method is called internally.
   *
   *  ##### Examples
   *
   *      "something".isJSON();
   *      // -> false
   *      "\"something\"".isJSON();
   *      // -> true
   *      "{ foo: 42 }".isJSON();
   *      // -> false
   *      "{ \"foo\": 42 }".isJSON();
   *      // -> true
  **/
  function isJSON() {
    var str = this;
    if (str.blank()) return false;
    str = str.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@');
    str = str.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']');
    str = str.replace(/(?:^|:|,)(?:\s*\[)+/g, '');
    return (/^[\],:{}\s]*$/).test(str);
  }

이것은 문자열 객체를 전달하는 데 사용할 수있는 버전입니다.

function isJSON(str) {
    if ( /^\s*$/.test(str) ) return false;
    str = str.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@');
    str = str.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']');
    str = str.replace(/(?:^|:|,)(?:\s*\[)+/g, '');
    return (/^[\],:{}\s]*$/).test(str);
  }

function isJSON(str) {
    if ( /^\s*$/.test(str) ) return false;
    str = str.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@');
    str = str.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']');
    str = str.replace(/(?:^|:|,)(?:\s*\[)+/g, '');
    return (/^[\],:{}\s]*$/).test(str);
  }

console.log ("this is a json",  isJSON( "{ \"key\" : 1, \"key2@e\" : \"val\"}" ) )

console.log("this is not a json", isJSON( "{ \"key\" : 1, \"key2@e\" : pippo }" ) )


1
누구나이 모든 답변을 비교하기위한 테스트 스위트가 있습니까? 이 것이 올바른지 확인하고 싶습니다.
Lonnie Best

1
@LonnieBest 좋은 지적. 내 2 센트 나는 몇 년 동안 생산을 해왔으며 항상 훌륭하고 합리적인 실행 시간으로 일했습니다.
loretoparisi

4

이 답변은 trycatch 문의 비용을 줄입니다.

JQuery를 사용하여 JSON 문자열을 구문 분석하고 trycatch 문을 사용하여 예외를 처리했지만 구문 분석 할 수없는 문자열에 대한 예외를 던지면 코드 속도가 느려졌으므로 간단한 Regex를 사용하여 가능한 JSON 문자열인지 여부를 확인했습니다. 구문을 확인하여 JQuery를 사용하여 문자열을 구문 분석하여 일반적인 방법을 사용했습니다.

if (typeof jsonData == 'string') {
    if (! /^[\[|\{](\s|.*|\w)*[\]|\}]$/.test(jsonData)) {
        return jsonData;
    }
}

try {
    jsonData = $.parseJSON(jsonData);
} catch (e) {

}

중첩 된 JSON 응답을 구문 분석하기 위해 이전 코드를 재귀 함수로 래핑했습니다.


jQuery는 JSON.parse ()가 무엇을하지 않습니까?
ADJenks

3

아마도 유용 할 것입니다 :

    function parseJson(code)
{
    try {
        return JSON.parse(code);
    } catch (e) {
        return code;
    }
}
function parseJsonJQ(code)
{
    try {
        return $.parseJSON(code);
    } catch (e) {
        return code;
    }
}

var str =  "{\"a\":1,\"b\":2,\"c\":3,\"d\":4,\"e\":5}";
alert(typeof parseJson(str));
alert(typeof parseJsonJQ(str));
var str_b  = "c";
alert(typeof parseJson(str_b));
alert(typeof parseJsonJQ(str_b));

산출:

IE7 : 문자열 , 개체, 문자열, 문자열

크롬 : 개체, 개체, 문자열, 문자열


2

나는 당신이 그것을 피하고 싶은 이유를 알고 있다고 생각합니다. 그러나 어쩌면 시도 & 캐치! == 시도 & 캐치. ; o) 이것은 내 마음에왔다 :

var json_verify = function(s){ try { JSON.parse(s); return true; } catch (e) { return false; }};

따라서 다음과 같이 JSON 객체에 클립을 더럽힐 수도 있습니다.

JSON.verify = function(s){ try { JSON.parse(s); return true; } catch (e) { return false; }};

가능한 한 캡슐화되어있어 오류가 발생하지 않을 수 있습니다.


2

다음은 타이프 스크립트 버전입니다.

JSONTryParse(input) {
    try {
        //check if the string exists
        if (input) {
            var o = JSON.parse(input);

            //validate the result too
            if (o && o.constructor === Object) {
                return o;
            }
        }
    }
    catch (e) {
    }

    return false;
};

Typescript는 자바 스크립트가 아니지만 대답은 것 같습니다.
Lonnie Best

1

var jsonstring='[{"ConnectionString":"aaaaaa","Server":"ssssss"}]';

if(((x)=>{try{JSON.parse(x);return true;}catch(e){return false}})(jsonstring)){

document.write("valide json")

}else{
document.write("invalide json")
}


1

유스 케이스가 응답이 HTML인지 아니면 JSON인지를 나타내는 것으로 시작 의견에서 유추합니다. 이 경우에, 당신은 때 JSON을 받고, 당신은 아마 그것을 분석하고 어쨌든 코드에서 어떤 점에서 잘못된 JSON을 취급해야한다. 아무것도 제외하고는 JSON이 예상되지만 유효하지 않은 JSON이 수신되면 브라우저에서 알려 드리겠습니다 (사용자는 의미있는 오류 메시지를 프록시로 사용합니다)!

따라서 JSON에 대한 정규 표현식을 수행하는 것은 불필요합니다 (내 경험 에서처럼 대부분의 유스 케이스). 아래와 같은 것을 사용하는 것이 좋습니다.

function (someString) {
  // test string is opened with curly brace or machine bracket
  if (someString.trim().search(/^(\[|\{){1}/) > -1) {
    try { // it is, so now let's see if its valid JSON
      var myJson = JSON.parse(someString);
      // yep, we're working with valid JSON
    } catch (e) {
      // nope, we got what we thought was JSON, it isn't; let's handle it.
    }
  } else {
    // nope, we're working with non-json, no need to parse it fully
  }
}

그건 당신이 예외 핸들이 아닌 유효한 JSON 코드를 가진 저장해야 하고 동시에 푸딩 JSON을주의해야합니다.


이 하이브리드 솔루션은 JSON이 아닌 대부분의 경우 시도 포착을 피할 수있는 효율적인 방법 인 것 같습니다. 나는 당신의 접근 방식의 측면을 좋아합니다.
Lonnie Best

1
if(resp) {
    try {
        resp = $.parseJSON(resp);
        console.log(resp);
    } catch(e) {
        alert(e);
    }
}

이것이 당신에게도 효과가 있기를 바랍니다.


0
function get_json(txt)
{  var data

   try     {  data = eval('('+txt+')'); }
   catch(e){  data = false;             }

   return data;
}

오류가 있으면 false를 리턴하십시오.

오류가 없으면 json 데이터를 반환하십시오.


4
"솔루션에는 try / catch가 포함되어 있지 않아야합니다."
ddmps

1
왜? 이것은 보장 된 방법입니다 ... 사용하지 않는 것이 어리석은 일입니다! 영어를 모르는 것이 유감입니다. Google 번역을 사용했습니다
Emrah Tuncel 23.32의

흥미 롭군 JSON.parse와이 평가 기반 솔루션의 성능 비교를보고 싶습니다. 그러나 이것은 보안 / 주입 관점에서 무섭게 보입니다.
Lonnie Best

0

javascript eval () 함수를 사용하여 유효한지 확인할 수 있습니다.

예 :

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

try {
  json = eval(jsonString);
} catch (exception) {
  //It's advisable to always catch an exception since eval() is a javascript executor...
  json = null;
}

if (json) {
  //this is json
}

또는 json.org의JSON.parse 함수를 사용할 수 있습니다 .

try {
  json = JSON.parse(jsonString);
} catch (exception) {
  json = null;
}

if (json) {
  //this is json
}

도움이 되었기를 바랍니다.

경고 : eval()위험 누군가가 악의적 인 JS 코드를 추가하는 경우 그것을 실행하기 때문에. JSON 문자열이 신뢰할 수 있는지 확인하십시오. 즉, 신뢰할 수있는 소스에서 가져 왔습니다.

편집 내 첫 번째 솔루션의 경우이 작업을 수행하는 것이 좋습니다.

 try {
      json = eval("{" + jsonString + "}");
    } catch (exception) {
      //It's advisable to always catch an exception since eval() is a javascript executor...
      json = null;
    }

json-ness 를 보장 합니다. jsonString순수 JSON이 아닌 경우 eval은 예외를 throw합니다.


eval을 사용한 첫 번째 예는 "<div> foo </ div>"가 유효한 JSON이라고 말합니다. 브라우저마다 다르게 작동하지만 FireFox에서는 eval ()이 XML을 허용하는 것으로 보입니다.
Mark Lutton

고맙지 만 팀과 함께 이것을 실행하고 그들은 try / catch를 사용하지 않는 것을 원합니다. 질문은 새로운 제목과 함께 편집됩니다. 미안합니다.
Chi Chan

@ Mark Lutton, 객체 유형은 JSON이 아니라 XML Dom Document입니다 (Firefox의 정확한 유형이 무엇인지 잊었습니다).
Buhake Sindi

1
eval은 "alert (5);"와 같은 유효한 JavaScript도 허용합니다. 작은 따옴표로 묶은 문자열은 유효한 JSON이 아닙니다.
Mark Lutton

12
이것은 순수한 평가입니다.
Chris Baker

0

아, try catch를 사용하여 유효한 JSON인지 여부를 확인할 수 있습니다.

Firfox Quantom 60.0.1에서 테스트

함수 내부의 함수를 사용하여 JSON을 테스트하고 해당 출력을 사용하여 문자열의 유효성을 검사하십시오. 예를 들어요.

    function myfunction(text){

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

  //content of your real function   
        if(testJSON(text)){
            console.log("json");
        }else{
            console.log("not json");
        }
    }

//use it as a normal function
        myfunction('{"name":"kasun","age":10}')

0

내 경우에는을 IsJsonString(str)사용 하는 기능이 작동 JSON.parse(str)하지 않습니다. GraphiQL
에서 json 출력의 유효성을 검사하려고 시도했지만 항상 false를 반환합니다. 운 좋게도 isJSON 이 더 잘 작동합니다.

var test = false;

$('body').on('DOMSubtreeModified', '.resultWrap', function() {

    if (!test) {   
        var resultWrap = "{" + $('#graphiql .resultWrap').text().split("{").pop();
        if isJSON(resultWrap) {test = !test;}
        console.log(resultWrap); 
        console.log(resultWrap.isJSON());
    }

});

샘플 출력 :

THREE.WebGLRenderer 79
draw.js:170 {xxxxxxxxxx
draw.js:170 false
draw.js:170 {xxxxxxxxxx 
draw.js:170 false
draw.js:170 {xxxxxxxxxx 
draw.js:170 false
draw.js:170 {xxxxxxxxxx 
draw.js:170 false
draw.js:170 {​
draw.js:170 false
draw.js:170 {  "PI": 3.141592653589793,​
draw.js:170 false
draw.js:170 {  "PI": 3.141592653589793,  "time": 1570751209006,​
draw.js:170 false
draw.js:170 {  "PI": 3.141592653589793,  "time": 1570751209006,  "tick": 156,​
draw.js:170 false
draw.js:170 {  "PI": 3.141592653589793,  "time": 1570751209006,  "tick": 156,  "tickr": 1.56,​
draw.js:170 false
draw.js:170 {  "PI": 3.141592653589793,  "time": 1570751209006,  "tick": 156,  "tickr": 1.56,  "fps": 41.666666666666664,​
draw.js:170 false
draw.js:170 {  "PI": 3.141592653589793,  "time": 1570751209006,  "tick": 156,  "tickr": 1.56,  "fps": 41.666666666666664,  "width": 396.984,​
draw.js:170 false
draw.js:170 {  "PI": 3.141592653589793,  "time": 1570751209006,  "tick": 156,  "tickr": 1.56,  "fps": 41.666666666666664,  "width": 396.984,  "height": 327
draw.js:170 false
draw.js:170 {  "PI": 3.141592653589793,  "time": 1570751209006,  "tick": 156,  "tickr": 1.56,  "fps": 41.666666666666664,  "width": 396.984,  "height": 327}​
draw.js:170 false
draw.js:170 {  "PI": 3.141592653589793,  "time": 1570751209006,  "tick": 156,  "tickr": 1.56,  "fps": 41.666666666666664,  "width": 396.984,  "height": 327}
draw.js:170 true

0

부울을 반환하고 결과를 포함하는 byref 매개 변수를 처리하는 "try"함수의 .Net 규칙을 좋아하는 사람들을 위해. out 매개 변수가 필요하지 않으면 생략하고 반환 값을 사용할 수 있습니다.

StringTests.js

  var obj1 = {};
  var bool1 = '{"h":"happy"}'.tryParse(obj1); // false
  var obj2 = {};
  var bool2 = '2114509 GOODLUCKBUDDY 315852'.tryParse(obj2);  // false

  var obj3 = {};
  if('{"house_number":"1","road":"Mauchly","city":"Irvine","county":"Orange County","state":"California","postcode":"92618","country":"United States of America","country_code":"us"}'.tryParse(obj3))
    console.log(obj3);

StringUtils.js

String.prototype.tryParse = function(jsonObject) {
  jsonObject = jsonObject || {};
  try {
    if(!/^[\[{]/.test(this) || !/[}\]]$/.test(this)) // begin / end with [] or {}
      return false; // avoid error handling for strings that obviously aren't json
    var json = JSON.parse(this);
    if(typeof json === 'object'){
      jsonObject.merge(json);
      return true;
    }
  } catch (e) {
    return false;
  }
}

ObjectUtils.js

Object.defineProperty(Object.prototype, 'merge', {
  value: function(mergeObj){
    for (var propertyName in mergeObj) {
      if (mergeObj.hasOwnProperty(propertyName)) {
        this[propertyName] = mergeObj[propertyName];
      }      
    }
    return this;
  },
  enumerable: false, // this is actually the default
});

-1

매우 간단한 한 줄짜리 코드 (그러나 Hacky 접근 방식)

if (expected_json.id === undefined){
   // not a json
}
else{
   // json
}

참고 : 이것은 id와 같은 JSON 문자열이 예상되는 경우에만 작동합니다. API에 사용하고 JSON 또는 일부 오류 문자열로 결과를 기대합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.