Как узнать, является ли переменная JSON или что-то еще? Есть ли функция JQuery или что-то, что я могу использовать, чтобы понять это?
Как узнать, является ли объект JSON в javascript?
Ответ 1
На основе ваших комментариев кажется, что вы не хотите знать, является ли строка допустимой JSON, а скорее, может ли объект быть успешно закодирован как JSON (например, не содержит никаких объектов Date, определенные классы и т.д.).
Здесь есть два подхода: попытайтесь проанализировать объект и его "детей" (следить за рекурсивными объектами) или сосать-и-видеть. Если у вас есть JSON-кодер под рукой (JSON.stringify
в последних браузерах или плагин, например jquery-json), последний, вероятно, является более простым и более надежный подход:
function canJSON(value) {
try {
JSON.stringify(value);
return true;
} catch (ex) {
return false;
}
}
Анализ объекта напрямую требует, чтобы вы могли определить, является ли он "простым" объектом (т.е. создается с использованием объектного литерала или new Object()
), что, в свою очередь, требует, чтобы вы могли получить его прототип, всегда легко. Я нашел следующий код для работы в IE7, FF3, Opera 10, Safari 4 и Chrome (и, скорее всего, другие версии этих браузеров, которые я просто не тестировал).
var getPrototypeOf;
if (Object.getPrototypeOf) {
getPrototypeOf = Object.getPrototypeOf;
} else if (typeof ({}).__proto__ === "object") {
getPrototypeOf = function(object) {
return object.__proto__;
}
} else {
getPrototypeOf = function(object) {
var constructor = object.constructor;
if (Object.prototype.hasOwnProperty.call(object, "constructor")) {
var oldConstructor = constructor; // save modified value
if (!(delete object.constructor)) { // attempt to "unmask" real constructor
return null; // no mask
}
constructor = object.constructor; // obtain reference to real constructor
object.constructor = oldConstructor; // restore modified value
}
return constructor ? constructor.prototype : null;
}
}
// jQuery.isPlainObject() returns false in IE for (new Object())
function isPlainObject(value) {
if (typeof value !== "object" || value === null) {
return false;
}
var proto = getPrototypeOf(value);
// the prototype of simple objects is an object whose prototype is null
return proto !== null && getPrototypeOf(proto) === null;
}
var serializablePrimitives = { "boolean" : true, "number" : true, "string" : true }
function isSerializable(value) {
if (serializablePrimitives[typeof value] || value === null) {
return true;
}
if (value instanceof Array) {
var length = value.length;
for (var i = 0; i < length; i++) {
if (!isSerializable(value[i])) {
return false;
}
}
return true;
}
if (isPlainObject(value)) {
for (var key in value) {
if (!isSerializable(value[key])) {
return false;
}
}
return true;
}
return false;
}
Так что да... Я бы рекомендовал подход try/catch.; -)
Ответ 2
function isJSON(data) {
var isJson = false
try {
// this works with JSON string and JSON object, not sure about others
var json = $.parseJSON(data);
isJson = typeof json === 'object' ;
} catch (ex) {
console.error('data is not JSON');
}
return isJson;
}
Ответ 3
Вы можете использовать [json2.js] с сайта JSON Github Дугласа Крокфорда для его анализа.
Ответ 4
JSON - это метод кодирования, а не внутренний тип переменной.
Вы можете загружать в некоторый текст, который кодируется JSON, который затем использует javascript для заполнения ваших переменных. Или вы можете экспортировать строку, содержащую кодированный JSON набор данных.
Ответ 5
Единственное тестирование, которое я сделал, - проверить строку, с двойными кавычками и без нее, и это проходит этот тест. http://forum.jquery.com/topic/isjson-str
Изменить: Похоже, что последний прототип имеет новую реализацию, аналогичную предыдущей. http://prototypejs.org/assets/2010/10/12/prototype.js
function isJSON() {
var str = this;
if (str.blank()) return false;
str = str.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@');
str = str.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']');
str = str.replace(/(?:^|:|,)(?:\s*\[)+/g, '');
return (/^[\],:{}\s]*$/).test(str);
}