Как я могу проверить, является ли значение объектом json?


мой код на стороне сервера возвращает значение, которое является объектом json при успешном выполнении и строкой "false" при сбое. Теперь как я могу проверить, является ли возвращаемое значение JSON-объект?

12 92

12 ответов:

jQuery.parseJSON () должен возвращать объект типа "object", если строка была JSON, поэтому вам нужно только проверить тип с помощью 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
  }
}

выбранное решение не работает для меня, потому что я получаю

     "Unexpected Token <" 

ошибка в Chrome. Это связано с тем, что ошибка выбрасывается, как только при разборе попадается и неизвестный символ. Однако есть способ обойти это, если вы возвращаете только строковые значения через ajax (что может быть довольно полезно, если вы используете PHP или ASPX для обработки запросов ajax и можете или не можете вернуть JSON в зависимости от условий)

решение вполне просто, вы можете сделать следующее, чтобы проверить, если это был действительный JSON return

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

Как я уже говорил, это решение для того, если вы либо возвращаете строковый тип материала из вашего запроса AJAX, либо возвращаете смешанный тип.

лучший способ проверить, что объект имеет тип 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"]

даже простой логический оператор или целое число могут быть приняты как допустимые в синтаксисе JSON. Это привело бы нас к тому, что еще много проверок. Поэтому наиболее целесообразно проверить, имеет ли что-либо синтаксис JSON, способ будет:

решение 3 (Популярные)

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

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

Если у вас есть 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, который не всегда доступен или требуется. Во-вторых, он делает полную стрингизацию объекта, который для меня является излишним. Вот простая функция, которая тщательно определяет, является ли значение 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 чтобы получить его в браузере.

надеюсь, это кому-то поможет!

Я использую это для проверки объекта 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;
}

вы должны вернуть json всегда, но и изменяют его статус, или в следующем примере тег ResponseCode свойства:

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