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

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

Ответ 1

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

Ответ 2

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

     "Unexpected Token <" 

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

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

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

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

Ответ 3

Если у вас есть jQuery, используйте isPlainObject.

if ($.isPlainObject(my_var)) {}

Ответ 4

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

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

Ответ 5

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

Ответ 6

Поскольку это просто false и json object, почему бы вам не проверить, является ли это false, иначе это должен быть json.

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

Ответ 7

Я знаю, что эта ветка уже ответила, но придя сюда не решила мои проблемы, я нашел эту функцию где-то в другом месте. возможно, кто-то придет сюда, найдет для них что-то полезное;

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

Ответ 8

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

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

Ответ 9

Если вы хотите явно проверить правильность JSON (в отличие от отсутствия возвращаемого значения false), вы можете использовать подход синтаксического анализа, как описано здесь.

Ответ 10

Мне не нравится принятый ответ. Прежде всего, это требует jQuery, который не всегда доступен или требуется. Во-вторых, он выполняет полное строение объекта, который для меня является излишним. Здесь простая функция, которая полностью определяет, является ли значение JSON-подобным, используя не более чем несколько частей библиотеки lodash для универсальности.

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, чтобы получить его в браузере.

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

Ответ 11

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

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