값이 json 객체인지 어떻게 확인할 수 있습니까?


101

내 서버 측 코드는 성공하면 json 객체이고 실패하면 문자열 'false'인 값을 반환합니다. 이제 반환 된 값이 json 객체인지 어떻게 확인할 수 있습니까?


2
실제로 "귀하의"서버 측 코드 인 경우 "때로는 JSON이고 때로는 그렇지 않은"상황을 생성하는 대신 JSON 결과에 상태 필드가없는 이유는 무엇입니까?
HostileFork은 그나마 신뢰 SE 말한다

@Hostile 디버깅 이유로. 이제 서버가 어떤 종류의 실패를 던질 지 모르고 그 시점에서 json이 사용되지 않습니다.
bart

1
서버 응답에 오류 코드 (명명 된 필드)가있는 것이 어떻게이를 약화시키는 지 아직 알 수 없습니다. Freebase에 충분합니다! wiki.freebase.com/wiki/MQL_errors
HostileFork은 그나마 신뢰 SE 말한다

현재 허용 된 답변이 잘못된 경우 허용 된 답변을 Serguei Federov의 답변으로 변경하십시오.
Serj Sagan

"json 객체"란 무엇입니까? JSON 문자열과 JS 객체가 있지만 "JavaScript Object Notation 객체"와 같은 것은 없습니다.
mpen

답변:


105

jQuery.parseJSON ()은 문자열이 JSON 인 경우 "object"유형의 객체를 반환해야하므로 유형을 확인하기 만하면됩니다. typeof

var response=jQuery.parseJSON('response from server');
if(typeof response =='object')
{
  // It is JSON
}
else
{
  if(response ===false)
  {
     // the response was a string "false", parseJSON will convert it to boolean false
  }
  else
  {
    // the response was something else
  }
}

29
또한 parseJSON는 JSON 값 이외의 (즉, HTML)를 처리 할 것입니다 가능성이있는 경우 예외 시도 / 캐치를 사용해야 할 수도 있습니다
acorncom

2
jQuery 1.9 이전에는 $ .parseJSON이 유효한 JSON이 아니더라도 빈 문자열, null 또는 정의되지 않은 문자열이 전달되면 오류를 발생시키는 대신 null을 반환했습니다. jquery 사이트 링크
gloomy.penguin 2013 년

7
이 솔루션은 "SyntaxError: JSON.parse: unexpected character"오류를 반환하기 때문에 최고가 아닙니다 ! 내가 생각하는 최고의 솔루션을 사용하는 시도로 말했다 / 캐치 Serguei Fedorov여기에 : stackoverflow.com/questions/4295386/...
나비 KAZ

2
jquery를 사용하지 않으려면 다음과 같이 생성자 유형을 확인하여 바닐라 JS를 사용할 수 있습니다. stackoverflow.com/questions/11182924/…
Mat

2
이 대답은 올바르지 않습니다. Serguei Federov의 대답이 허용되는 대답이어야합니다.
Serj Sagan 2015

148

선택한 솔루션 이 실제로 작동하지 않습니다.

     "Unexpected Token <" 

Chrome에 오류가 있습니다. 이는 구문 분석이 발생하고 알 수없는 문자가 발생하자마자 오류가 발생하기 때문입니다. 그러나 ajax를 통해 문자열 값만 반환하는 경우이 문제를 해결할 수있는 방법이 있습니다 (PHP 또는 ASPX를 사용하여 ajax 요청을 처리하고 조건에 따라 JSON을 반환하거나 반환하지 않을 경우 매우 유용 할 수 있음).

솔루션은 매우 간단합니다. 유효한 JSON 반환인지 확인하려면 다음을 수행 할 수 있습니다.

       var IS_JSON = true;
       try
       {
               var json = $.parseJSON(msg);
       }
       catch(err)
       {
               IS_JSON = false;
       }                

앞서 말했듯이 AJAX 요청에서 문자열 유형 항목을 반환하거나 혼합 유형을 반환하는 경우에 대한 해결책입니다.


질문은 어느 시점에서든 JSON이 아닌 문자열에 관한 것이 아닙니다. 서버는 항상 유효한 JSON을 반환합니다 (문자열 false도 유효한 JSON). 문제는 단일 지점에 관한 것입니다. 파싱 된 JSON 문자열이 부울 false인지 객체
인지 구별

2
성능 고려 사항 : 기능이 포장, 두 번 JSON을 구문 분석 할에 있는지 확인하십시오 (한 번 시도 캐치 내부와 함수를 호출하는 코드에서 한 번.)
미키 엘 Cornille

사용할 수 있는 도우미 함수 isJSON () 입니다 : isJSON(someValue).
Chofoteddy

19

솔루션 3 (가장 빠른 방법)

/**
 * @param Object
 * @returns boolean
 */
function isJSON (something) {
    if (typeof something != 'string')
        something = JSON.stringify(something);

    try {
        JSON.parse(something);
        return true;
    } catch (e) {
        return false;
    }
}

다음과 같이 사용할 수 있습니다.

var myJson = [{"user":"chofoteddy"}, {"user":"bart"}];
isJSON(myJson); // true

객체가 JSON 또는 배열 유형인지 확인하는 가장 좋은 방법은 다음과 같습니다.

var a = [],
    o = {};

해결책 1

toString.call(o) === '[object Object]'; // true
toString.call(a) === '[object Array]'; // true

해결 방법 2

a.constructor.name === 'Array'; // true
o.constructor.name === 'Object'; // true

그러나 엄밀히 말하면 배열은 JSON 구문의 일부입니다. 따라서 다음 두 가지 예는 JSON 응답의 일부입니다.

console.log(response); // {"message": "success"}
console.log(response); // {"user": "bart", "id":3}

과:

console.log(response); // [{"user":"chofoteddy"}, {"user":"bart"}]
console.log(response); // ["chofoteddy", "bart"]

AJAX / JQuery (권장)

JQuery를 사용하여 AJAX를 통해 정보를 가져 오는 경우. "dataType"속성에 "json"값을 입력하는 것이 좋습니다. 이렇게하면 JSON이 있는지 여부에 관계없이 JQuery가이를 확인하고 "성공"및 "오류"기능을 통해 알려줍니다. 예:

$.ajax({
    url: 'http://www.something.com',
    data: $('#formId').serialize(),
    method: 'POST',
    dataType: 'json',
    // "sucess" will be executed only if the response status is 200 and get a JSON
    success: function (json) {},
    // "error" will run but receive state 200, but if you miss the JSON syntax
    error: function (xhr) {}
});


6
var checkJSON = function(m) {

   if (typeof m == 'object') { 
      try{ m = JSON.stringify(m); }
      catch(err) { return false; } }

   if (typeof m == 'string') {
      try{ m = JSON.parse(m); }
      catch (err) { return false; } }

   if (typeof m != 'object') { return false; }
   return true;

};


checkJSON(JSON.parse('{}'));      //true
checkJSON(JSON.parse('{"a":0}')); //true
checkJSON('{}');                  //true
checkJSON('{"a":0}');             //true
checkJSON('x');                   //false
checkJSON('');                    //false
checkJSON();                      //false

4

그것은 단지 거짓이고 json 객체이기 때문에 그것이 거짓인지 확인하지 않는 이유는 무엇입니까, 그렇지 않으면 json이어야합니다.

if(ret == false || ret == "false") {
    // json
}

2

이 스레드가 이미 답변 된 것을 알고 있지만 여기에 오는 것이 내 문제를 실제로 해결하지 못했기 때문에 다른 곳에서이 기능을 발견했습니다. 여기에 오는 누군가는 그것이 그들에게 유용하다는 것을 알게 될 것입니다.

function getClass(obj) {
  if (typeof obj === "undefined")
    return "undefined";
  if (obj === null)
    return "null";
  return Object.prototype.toString.call(obj)
    .match(/^\[object\s(.*)\]$/)[1];
}

1
var data = 'json string ?';
var jdata = null;
try
{
    jdata = $.parseJSON(data);  
}catch(e)
{}

if(jdata)
{
//use jdata
}else
{
//use data
}

0

(반환 된 값이없는 것과는 반대로) 유효한 JSON을 명시 적으로 테스트하려는 경우 여기에false 설명 된대로 구문 분석 접근 방식을 사용할 수 있습니다 .


0

나는 받아 들여지는 대답이 정말 마음에 들지 않습니다. 무엇보다도 항상 사용 가능하거나 필요하지 않은 jQuery가 필요합니다. 둘째, 그것은 나에게 과잉 인 대상의 완전한 문자열 화를 수행합니다. 다음은 일반성 을 위해 lodash 라이브러리 의 몇 부분 만 사용하여 값이 JSON과 유사한 지 철저히 감지하는 간단한 함수입니다 .

import * as isNull from 'lodash/isNull'
import * as isPlainObject from 'lodash/isPlainObject'
import * as isNumber from 'lodash/isNumber'
import * as isBoolean from 'lodash/isBoolean'
import * as isString from 'lodash/isString'
import * as isArray from 'lodash/isArray'

function isJSON(val) {
  if (isNull(val)
   || isBoolean(val)
   || isString(val))
    return true;
  if (isNumber(val)) 
     return !isNaN(val) && isFinite(val)
  if (isArray(val))
    return Array.prototype.every.call(val, isJSON)
  if (isPlainObject(val)) {
    for (const key of Object.keys(val)) {
      if (!isJSON(val[key]))
        return false
    }
    return true
  }
  return false
}

npm에 패키지로 넣는 데 시간이 걸렸습니다 : https://npmjs.com/package/is-json-object . Webpack 과 같은 것과 함께 사용 하여 브라우저에서 가져옵니다.

이것이 누군가를 돕기를 바랍니다!


0

이것을 사용하여 JSON 객체의 유효성을 검사합니다.

function isJsonObject(obj) {
    try {
        JSON.parse(JSON.stringify(obj));
    } catch (e) {
        return false;
    }
    return true;
}

이것을 사용하여 JSON 문자열의 유효성을 검사합니다.

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

0

나는 제안 된 모든 답변을 시도했지만 아무것도 효과가 없었으므로 사용해야했습니다.

jQuery.isEmptyObject()

이 문제로 다른 사람을 돕는 괭이


-1

항상 json을 반환해야 하지만 상태를 변경 하거나 다음 예제에서 ResponseCode 속성을 변경 해야 합니다.

if(callbackResults.ResponseCode!="200"){
    /* Some error, you can add a message too */
} else {
    /* All fine, proceed with code */
};

@bart, if 조건에서 개체를 제공하면 검사를 수행 할 수 있습니다.
kobe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.