[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;
}
테스트 결과 :
답변
이것을 다시 한 번 살펴 보겠습니다 (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으로 응답하는 경우 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 코드도 사용할 수 있습니다.