108

ループする必要があるネストされた JSON オブジェクトがあり、各キーの値は文字列、JSON 配列、または別の JSON オブジェクトである可能性があります。オブジェクトの種類に応じて、さまざまな操作を実行する必要があります。オブジェクトのタイプをチェックして、それが文字列、JSON オブジェクト、または JSON 配列であるかどうかを確認する方法はありますか?

typeofandを使用してみましたが、 JSON オブジェクトと配列の両方のオブジェクトを返し、実行するとエラーが発生するためinstanceof、どちらも機能していないようです。typeofinstanceofobj 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
    }
}

上記のオブジェクト チェックを実行するにはどうすればよいですか?

4

18 に答える 18

147

コンストラクター属性を確認します。

例えば

var stringConstructor = "test".constructor;
var arrayConstructor = [].constructor;
var objectConstructor = ({}).constructor;

function whatIsIt(object) {
    if (object === null) {
        return "null";
    }
    if (object === undefined) {
        return "undefined";
    }
    if (object.constructor === stringConstructor) {
        return "String";
    }
    if (object.constructor === arrayConstructor) {
        return "Array";
    }
    if (object.constructor === objectConstructor) {
        return "Object";
    }
    {
        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]));
}

編集: null チェックと未定義チェックを追加しました。

于 2012-06-25T02:57:38.073 に答える
31

Array.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' はオブジェクト
'i' はその他

于 2012-06-25T02:53:36.060 に答える
9

object文字列を解析した後に型を確認しようとしている場合はJSON、コンストラクター属性を確認することをお勧めします。

obj.constructor == Array || obj.constructor == String || obj.constructor == Object

これは、typeof や instanceof よりもはるかに高速なチェックになります。

JSON ライブラリがこれらの関数で構築されたオブジェクトを返さない場合、私は非常に疑わしいと思います。

于 2012-06-25T02:55:30.097 に答える
5

「型付き」オブジェクトのコンストラクターがそのオブジェクトの名前にカスタマイズされているため、@PeterWilkinsonによる答えはうまくいきませんでした。私はtypeofで作業しなければなりませんでした

function isJson(obj) {
    var t = typeof obj;
    return ['boolean', 'number', 'string', 'symbol', 'function'].indexOf(t) == -1;
}
于 2015-05-22T23:16:24.947 に答える
5

JSON 解析用の独自のコンストラクターを作成できます。

var JSONObj = function(obj) { $.extend(this, JSON.parse(obj)); }
var test = new JSONObj('{"a": "apple"}');
//{a: "apple"}

次に、 instanceof をチェックして、元々解析が必要かどうかを確認します

test instanceof JSONObj
于 2012-06-25T02:57:31.557 に答える
4

この問題を解決するために 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

于 2016-02-13T19:18:15.533 に答える
4

データを解析してから、オブジェクトを取得したかどうかを確認することもできます。

var testIfJson = JSON.parse(data);
if (typeof testIfJson == "object"){
    //Json
} else {
    //Not Json
}
于 2015-07-07T14:55:34.020 に答える
3

Number をチェックしてみませんか - 少し短く、IE/Chrome/FF/node.js で動作します

function whatIsIt(object) {
    if (object === null) {
        return "null";
    }
    else if (object === undefined) {
        return "undefined";
    }
    if (object.constructor.name) {
            return object.constructor.name;
    }
    else { // last chance 4 IE: "\nfunction Number() {\n    [native code]\n}\n" / node.js: "function String() { [native code] }"
        var name = object.constructor.toString().split(' ');
        if (name && name.length > 1) {
            name = name[1];
            return name.substr(0, name.indexOf('('));
        }
        else { // unreachable now(?)
            return "don't know";
        }
    }
}

var testSubjects = ["string", [1,2,3], {foo: "bar"}, 4];
// Test all options
console.log(whatIsIt(null));
console.log(whatIsIt());
for (var i=0, len = testSubjects.length; i < len; i++) {
    console.log(whatIsIt(testSubjects[i]));
}

于 2019-07-09T10:32:19.650 に答える
2

typeof 演算子とコンストラクター属性のチェックを組み合わせます (Peter による):

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       
于 2016-04-17T10:27:46.833 に答える
2

私はこれが良い答えを持つ非常に古い質問であることを知っています. ただし、私の 2¢ を追加することはまだ可能のようです。

JSONオブジェクト自体ではなく、JSONとしてフォーマットされた文字列をテストしようとしていると仮定すると(これはあなたの場合のようvar dataです)、ブール値を返す次の関数を使用できます( JSON'):

function isJsonString( jsonString ) {

  // This function below ('printError') can be used to print details about the error, if any.
  // Please, refer to the original article (see the end of this post)
  // for more details. I suppressed details to keep the code clean.
  //
  let printError = function(error, explicit) {
  console.log(`[${explicit ? 'EXPLICIT' : 'INEXPLICIT'}] ${error.name}: ${error.message}`);
  }


  try {
      JSON.parse( jsonString );
      return true; // It's a valid JSON format
  } catch (e) {
      return false; // It's not a valid JSON format
  }

}

上記の関数の使用例を次に示します。

console.log('\n1 -----------------');
let j = "abc";
console.log( j, isJsonString(j) );

console.log('\n2 -----------------');
j = `{"abc": "def"}`;
console.log( j, isJsonString(j) );

console.log('\n3 -----------------');
j = '{"abc": "def}';
console.log( j, isJsonString(j) );

console.log('\n4 -----------------');
j = '{}';
console.log( j, isJsonString(j) );

console.log('\n5 -----------------');
j = '[{}]';
console.log( j, isJsonString(j) );

console.log('\n6 -----------------');
j = '[{},]';
console.log( j, isJsonString(j) );

console.log('\n7 -----------------');
j = '[{"a":1, "b":   2}, {"c":3}]';
console.log( j, isJsonString(j) );

上記のコードを実行すると、次の結果が得られます。

1 -----------------
abc false

2 -----------------
{"abc": "def"} true

3 -----------------
{"abc": "def} false

4 -----------------
{} true

5 -----------------
[{}] true

6 -----------------
[{},] false

7 -----------------
[{"a":1, "b":   2}, {"c":3}] true

以下のスニペットを試してみて、うまくいくかどうかお知らせください。:)

重要: この投稿で紹介されている関数は、 JSON.parse ( ) 関数。

function isJsonString( jsonString ) {

  let printError = function(error, explicit) {
  console.log(`[${explicit ? 'EXPLICIT' : 'INEXPLICIT'}] ${error.name}: ${error.message}`);
  }


  try {
      JSON.parse( jsonString );
      return true; // It's a valid JSON format
  } catch (e) {
      return false; // It's not a valid JSON format
  }

}


console.log('\n1 -----------------');
let j = "abc";
console.log( j, isJsonString(j) );

console.log('\n2 -----------------');
j = `{"abc": "def"}`;
console.log( j, isJsonString(j) );

console.log('\n3 -----------------');
j = '{"abc": "def}';
console.log( j, isJsonString(j) );

console.log('\n4 -----------------');
j = '{}';
console.log( j, isJsonString(j) );

console.log('\n5 -----------------');
j = '[{}]';
console.log( j, isJsonString(j) );

console.log('\n6 -----------------');
j = '[{},]';
console.log( j, isJsonString(j) );

console.log('\n7 -----------------');
j = '[{"a":1, "b":   2}, {"c":3}]';
console.log( j, isJsonString(j) );

于 2020-02-26T06:45:29.323 に答える
1

これを試して

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 ) );
于 2015-09-18T14:54:12.143 に答える
0

追加のチェックでピーターの答え!もちろん、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!");
}
于 2014-08-20T20:05:52.897 に答える
-5

この汚い方法を試してください

 ('' + obj).includes('{')
于 2017-03-24T16:34:32.973 に答える