Код мого сервера повертає значення, яке є об'єктом json при успіху, а рядком "false" при відмові. Тепер як я можу перевірити, чи є повернене значення об'єктом json?
Код мого сервера повертає значення, яке є об'єктом json при успіху, а рядком "false" при відмові. Тепер як я можу перевірити, чи є повернене значення об'єктом json?
Відповіді:
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
}
}
"SyntaxError: JSON.parse: unexpected character"
помилка повернення ! , Я вважаю, що найкращим рішенням є використання спробувати / ловити, про що йдеться Serguei Fedorov
тут: stackoverflow.com/questions/4295386/…
Обране рішення насправді не працює для мене, тому що я отримую
"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, або якщо ви повертаєте змішаний тип.
false
також є дійсним JSON). Питання стосується лише однієї точки: як розрізнити, якщо проаналізований рядок JSON є false
isJSON(someValue)
.
/**
* @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 = {};
toString.call(o) === '[object Object]'; // true
toString.call(a) === '[object Array]'; // true
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"]
Якщо ви використовуєте 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)) {}
true
.
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
Оскільки це просто хибний та json-об’єкт, чому б вам не перевірити, чи він неправдивий, інакше він повинен бути 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, використовуючи не більше ніж кілька частин бібліотеки 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, щоб отримати його у браузері.
Сподіваюся, це комусь допоможе!
Я використовую це для перевірки об'єкта 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;
}
Я спробував усі запропоновані відповіді, нічого не працювало для мене, тому мені довелося користуватися
jQuery.isEmptyObject()
мотика, яка допомагає комусь іншому в цьому питанні
Ви повинні повертати json завжди , але змінити його статус або в наступному прикладі властивості ResponseCode :
if(callbackResults.ResponseCode!="200"){
/* Some error, you can add a message too */
} else {
/* All fine, proceed with code */
};