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

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

Ответы [ 12 ]

141 голосов
/ 31 августа 2012

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

     "Unexpected Token <" 

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

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

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

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

97 голосов
/ 28 ноября 2010

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
  }
}
17 голосов
/ 20 июля 2015

Решение 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 проверит его для вас и сообщит об этом через их функции «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) {}
});
13 голосов
/ 06 ноября 2013

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

if ($.isPlainObject(my_var)) {}
6 голосов
/ 13 августа 2016
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 голосов
/ 28 ноября 2010

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

if(ret == false || ret == "false") {
    // json
}
2 голосов
/ 13 августа 2013

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

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 голос
/ 31 августа 2013
var data = 'json string ?';
var jdata = null;
try
{
    jdata = $.parseJSON(data);  
}catch(e)
{}

if(jdata)
{
//use jdata
}else
{
//use data
}
0 голосов
/ 10 апреля 2018

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

Мне не очень нравится принятый ответ.В первую очередь это требует 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 , чтобы получить его в браузере.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...