Как проверить, является ли объект 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
}
}


Как выполнить проверку объекта, как показано выше?

662   12  

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 после разбора a JSON строка, я предлагаю проверить атрибут конструктора:

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
}

попробуйте этот грязный способ

 ('' + obj).includes('{')

Comments

    Ничего не найдено.