Как проверить, является ли объект JavaScript JSON
у меня есть вложенный объект JSON, который мне нужно перебрать, и значение каждого ключа может быть строкой, массивом JSON или другим объектом JSON. В зависимости от типа объекта, мне нужно выполнять различные операции. Есть ли способ проверить тип объекта, чтобы узнать, является ли он строкой, объектом JSON или массивом JSON?
Я пробовал использовать typeof и instanceof но оба, похоже, не работали, как typeof вернет объект как для объекта JSON, так и для массива, и instanceof дает ошибка, когда я делаю obj instanceof JSON.
чтобы быть более конкретным, после разбора JSON в объект JS, есть ли способ проверить, является ли это обычной строкой или объектом с ключами и значениями (из объекта JSON) или массивом (из массива JSON)?
например:
JSON
var data = "{'hi':
{'hello':
['hi1','hi2']
},
'hey':'words'
}";
Пример JavaScript
var jsonObj = JSON.parse(data);
var path = ["hi","hello"];
function check(jsonObj, path) {
var parent = jsonObj;
for (var i = 0; i < path.length-1; i++) {
var key = path[i];
if (parent != undefined) {
parent = parent[key];
}
}
if (parent != undefined) {
var endLength = path.length - 1;
var child = parent[path[endLength]];
//if child is a string, add some text
//if child is an object, edit the key/value
//if child is an array, add a new element
//if child does not exist, add a new key/value
}
}
Как выполнить проверку объекта, как показано выше?
12 ответов:
Я бы проверил атрибут конструктор.
например
var stringConstructor = "test".constructor; var arrayConstructor = [].constructor; var objectConstructor = {}.constructor; function whatIsIt(object) { if (object === null) { return "null"; } else if (object === undefined) { return "undefined"; } else if (object.constructor === stringConstructor) { return "String"; } else if (object.constructor === arrayConstructor) { return "Array"; } else if (object.constructor === objectConstructor) { return "Object"; } else { return "don't know"; } } var testSubjects = ["string", [1,2,3], {foo: "bar"}, 4]; for (var i=0, len = testSubjects.length; i < len; i++) { alert(whatIsIt(testSubjects[i])); }Edit: добавлена нулевая проверка и неопределенная проверка.
можно использовать массив.isArray для проверки массивов. Тогда typeof obj = = 'string' и typeof obj = = 'object'.
var s = 'a string', a = [], o = {}, i = 5; function getType(p) { if (Array.isArray(p)) return 'array'; else if (typeof p == 'string') return 'string'; else if (p != null && typeof p == 'object') return 'object'; else return 'other'; } console.log("'s' is " + getType(s)); console.log("'a' is " + getType(a)); console.log("'o' is " + getType(o)); console.log("'i' is " + getType(i));'S' это строка
' a ' - это массив
' o ' - это объект
" Я " - другое
вы можете сделать свой собственный конструктор для разбора JSON:
var JSONObj = function(obj) { $.extend(this, JSON.parse(obj)); } var test = new JSONObj('{"a": "apple"}'); //{a: "apple"}затем проверьте instanceof, чтобы увидеть, если он нуждается в разборе первоначально
test instanceof JSONObj
Если вы пытаетесь проверить тип
objectпосле разбора aJSONстрока, я предлагаю проверить атрибут конструктора:obj.constructor == Array || obj.constructor == String || obj.constructor == Objectэто будет гораздо быстрее проверить, чем typeof или instanceof.
Если a библиотека JSON не возвращает объекты, построенные с помощью этих функций, я был бы очень подозрителен к нему.
Я написал модуль npm для решения этой проблемы. Это доступно здесь:
object-types: модуль для поиска того, какие типы литералов лежат под объектамиустановить
npm install --save object-types
использование
const objectTypes = require('object-types'); objectTypes({}); //=> 'object' objectTypes([]); //=> 'array' objectTypes(new Object(true)); //=> 'boolean'взгляните, это должно решить вашу точную проблему. Дайте мне знать если вы имеете любые вопросы! https://github.com/dawsonbotsford/object-types
ответ @PeterWilkinson не работал для меня, потому что конструктор для "типизированного" объекта настроен на имя этого объекта. Мне пришлось работать с typeof
function isJson(obj) { var t = typeof obj; return ['boolean', 'number', 'string', 'symbol', 'function'].indexOf(t) == -1; }
объект JSON - это объект. Чтобы проверить погоду любой тип является типом объекта, оцените свойство конструктора.
function isObject(obj) { return obj !== undefined && obj !== null && obj.constructor == Object; }то же самое относится ко всем другим типам:
function isArray(obj) { return obj !== undefined && obj !== null && obj.constructor == Array; } function isBoolean(obj) { return obj !== undefined && obj !== null && obj.constructor == Boolean; } function isFunction(obj) { return obj !== undefined && obj !== null && obj.constructor == Function; } function isNumber(obj) { return obj !== undefined && obj !== null && obj.constructor == Number; } function isString(obj) { return obj !== undefined && obj !== null && obj.constructor == String; } function isInstanced(obj) { if(obj === undefined || obj === null) { return false; } if(isArray(obj)) { return false; } if(isBoolean(obj)) { return false; } if(isFunction(obj)) { return false; } if(isNumber(obj)) { return false; } if(isObject(obj)) { return false; } if(isString(obj)) { return false; } return true; }
попробуй такое
if ( typeof is_json != "function" ) function is_json( _obj ) { var _has_keys = 0 ; for( var _pr in _obj ) { if ( _obj.hasOwnProperty( _pr ) && !( /^\d+$/.test( _pr ) ) ) { _has_keys = 1 ; break ; } } return ( _has_keys && _obj.constructor == Object && _obj.constructor != Array ) ? 1 : 0 ; }это работает для примера ниже
var _a = { "name" : "me", "surname" : "I", "nickname" : { "first" : "wow", "second" : "super", "morelevel" : { "3level1" : 1, "3level2" : 2, "3level3" : 3 } } } ; var _b = [ "name", "surname", "nickname" ] ; var _c = "abcdefg" ; console.log( is_json( _a ) ); console.log( is_json( _b ) ); console.log( is_json( _c ) );
я объединяю оператор typeof с проверкой атрибута конструктора (по Питеру):
var typeOf = function(object) { var firstShot = typeof object; if (firstShot !== 'object') { return firstShot; } else if (object.constructor === [].constructor) { return 'array'; } else if (object.constructor === {}.constructor) { return 'object'; } else if (object === null) { return 'null'; } else { return 'don\'t know'; } } // Test var testSubjects = [true, false, 1, 2.3, 'string', [4,5,6], {foo: 'bar'}, null, undefined]; console.log(['typeOf()', 'input parameter'].join('\t')) console.log(new Array(28).join('-')); testSubjects.map(function(testSubject){ console.log([typeOf(testSubject), JSON.stringify(testSubject)].join('\t\t')); });результат:
typeOf() input parameter --------------------------- boolean true boolean false number 1 number 2.3 string "string" array [4,5,6] object {"foo":"bar"} null null undefined
ответ Питера с дополнительной проверкой! Конечно, не 100% гарантировано!
var isJson = false; outPutValue = "" var objectConstructor = {}.constructor; if(jsonToCheck.constructor === objectConstructor){ outPutValue = JSON.stringify(jsonToCheck); try{ JSON.parse(outPutValue); isJson = true; }catch(err){ isJson = false; } } if(isJson){ alert("Is json |" + JSON.stringify(jsonToCheck) + "|"); }else{ alert("Is other!"); }
вы также можете попробовать разобрать данные, а затем проверить, если вы получили объект:
var testIfJson = JSON.parse(data); if (typeOf testIfJson == "object") { //Json } else { //Not Json }
Comments