Як я можу перевірити, чи є об'єктом json?


101

Код мого сервера повертає значення, яке є об'єктом json при успіху, а рядком "false" при відмові. Тепер як я можу перевірити, чи є повернене значення об'єктом json?


2
Якщо це насправді "ваш" код сторони сервера, чому б не мати поля статусу в результаті JSON, а не створювати цю ситуацію "інколи - це - JSON - а - іноді - це - не" ...?
HostileFork каже, що не довіряти SE

@Hostile З причин налагодження. Ви ніколи не вказуєте, який саме збій буде викинутий сервером, і в цей момент json не використовується.
барт

1
Я досі не бачу, як наявність коду помилки (як названого поля) у відповіді сервера це підірве. Це досить добре для Freebase! wiki.freebase.com/wiki/MQL_errors
HostileFork каже, що не довіряти SE

Будь ласка, змініть прийняту відповідь на Сергея Федерова, якщо ви можете прийняти відповідь на даний момент неправильно.
Serj Sagan

Що таке "об'єкт json"? Є рядки JSON та JS-об'єкти, але немає такого поняття, як "Об'єкт нотації об'єкта JavaScript".
квітня

Відповіді:


105

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

29
Можливо, також потрібно використовувати спробу / лову для виключень, якщо можливо, що parseJSON матиме справу з чимось іншим, ніж значення JSON (тобто HTML)
acorncom

2
До jQuery 1.9 $ .parseJSON повернув null замість того, щоб видавати помилку, якщо вона була передана порожнім рядком, null або undefined, хоча вони не є дійсними JSON. jquery посилання на сайт
gloomy.penguin

7
Це рішення не найкраще, тому що "SyntaxError: JSON.parse: unexpected character"помилка повернення ! , Я вважаю, що найкращим рішенням є використання спробувати / ловити, про що йдеться Serguei Fedorovтут: stackoverflow.com/questions/4295386/…
Nabi KAZ

2
Якщо ви не хочете використовувати JQuery, ви можете використовувати ванільний JS шляхом перевірки типу конструктора , як описано тут: stackoverflow.com/questions/11182924 / ...
Мат

2
Ця відповідь невірна, відповідь Сергея Федерова має бути прийнятою відповіддю.
Serj Sagan

148

Обране рішення насправді не працює для мене, тому що я отримую

     "Unexpected Token <" 

помилка в Chrome. Це тому, що помилка викидається, як тільки синтаксис натрапляє на невідомий характер. Однак є спосіб, як це зробити, якщо ви повертаєте лише ajax значення через 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 (один раз у приміщенні спробу вловлювання та один раз у коді, який викликає функцію.)
Michiel 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) {}
});

13

Якщо у вас є jQuery, використовуйте isPlainObject .

if ($.isPlainObject(my_var)) {}

5
Якщо ви використовуєте isPlainObject у рядку, він поверне помилковим, наприклад, jQuery.isPlainObject ('{}')
Roy Shoa

Що ще важливіше, якщо воно містить властивість, не схоже на JSON, згідно з документами ця функція все одно повернеться true.
samvv

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


0

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


0

Мені не дуже подобається прийнята відповідь. Перш за все, він вимагає 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, щоб отримати його у браузері.

Сподіваюся, це комусь допоможе!


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, що зробить перевірку.
кобе
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.