1. ホーム
  2. javascript

[解決済み] JavaScriptのオブジェクトがJSONであるかどうかを確認する方法

2022-11-16 04:48:22

質問

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

私は typeofinstanceof が、どちらもうまくいかなかったようです。 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
    }
}

上記のようなオブジェクトチェックを行うにはどうしたらよいでしょうか?

どのように解決するのですか?

コンストラクタの属性を確認するんだ。

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チェックとundefinedチェックを追加しました。