programing

값이 JSON 개체인지 확인하려면 어떻게 해야 합니까?

fastcode 2023. 3. 31. 22:52
반응형

값이 JSON 개체인지 확인하려면 어떻게 해야 합니까?

서버 측 코드는 성공 시 JSON 개체, 실패 시 문자열 'false'false'반환된 값이 JSON 객체인지 확인하려면 어떻게 해야 합니까?

선택한 솔루션이 실제로 기능하지 않는 이유는

     "Unexpected Token <" 

Chrome 오류입니다.이는 구문 분석과 알 수 없는 문자가 발견되는 즉시 오류가 발생하기 때문입니다.단, Ajax를 통해 문자열 값만 반환하는 경우(PHP 또는 ASPX를 사용하여 Ajax 요청을 처리하고 조건에 따라 JSON을 반환할 수도 있고 반환하지 않을 수도 있음)에는 이 문제를 해결하는 방법이 있습니다.

솔루션은 매우 간단합니다.다음 절차를 수행하여 유효한 JSON 반환 여부를 확인할 수 있습니다.

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

앞서 말씀드린 바와 같이, 이것은 AJAX 요청에서 문자열 타입을 반환하는 경우와 혼합 타입을 반환하는 경우의 해결책입니다.

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
  }
}

솔루션 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 구문의 일부입니다.따라서 다음 2가지 예는 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가 이를 검증하고 "success" 및 "error" 함수를 통해 알릴 수 있습니다.예:

$.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) {}
});

jQuery가 있는 경우 isPlainObject를 사용합니다.

if ($.isPlainObject(my_var)) {}
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

그냥 false와 json 오브젝트이기 때문에 false 여부를 확인하고 그렇지 않으면 json이 틀림없습니다.

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

이 스레드가 이미 해결된 것은 알지만, 여기 와서 내 문제를 제대로 해결하지 못하고 다른 곳에서 이 기능을 찾았습니다.여기 오는 누군가가 도움이 될 거예요.

function getClass(obj) {
  if (typeof obj === "undefined")
    return "undefined";
  if (obj === null)
    return "null";
  return Object.prototype.toString.call(obj)
    .match(/^\[object\s(.*)\]$/)[1];
}
var data = 'json string ?';
var jdata = null;
try
{
    jdata = $.parseJSON(data);  
}catch(e)
{}

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

(반환된 값이 없는 것이 아니라) 유효한 JSON을 명시적으로 테스트하는 경우false)의 경우는, 여기서 설명하는 해석 방법을 사용할 수 있습니다.

나는 받아들여진 대답을 별로 좋아하지 않는다.무엇보다도 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
}

pm에 패키지로 올리기까지 시간이 걸렸어요.https://npmjs.com/package/is-json-object과 함께 사용하면 브라우저에 가져올 수 있습니다.

이게 누군가에게 도움이 되길 바라!

JSON 오브젝트의 유효성을 확인하기 위해 사용하고 있습니다.

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

이것을 사용하여 JSON String을 검증합니다.

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

제가 제시한 답변들을 다 해봤는데, 저한테는 아무 것도 안 먹혀서

jQuery.isEmptyObject()

이 문제를 해결하는 데 도움이 되는 괭이

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

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

언급URL : https://stackoverflow.com/questions/4295386/how-can-i-check-if-a-value-is-a-json-object

반응형