Как я могу проверить, является ли значение объектом json?
мой код на стороне сервера возвращает значение, которое является объектом json при успешном выполнении и строкой "false" при сбое. Теперь как я могу проверить, является ли возвращаемое значение JSON-объект?
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 чтобы получить его в браузере.
надеюсь, это кому-то поможет!