web-dev-qa-db-ja.com

JSONへのJavaScript連想配列

JavaScript連想配列をJSONに変換するにはどうすればよいですか?

私は次を試しました:

var AssocArray = new Array();

AssocArray["a"] = "The letter A"

console.log("a = " + AssocArray["a"]);

// result: "a = The letter A"

JSON.stringify(AssocArray);

// result: "[]"
73
ActionOwl

配列には、数値キーを持つエントリのみが必要です(配列もオブジェクトですが、実際にはこれらを混在させないでください)。

配列をJSONに変換する場合、プロセスでは数値プロパティのみが考慮されます。他のプロパティは単に無視されるため、結果として空の配列を取得します。配列のlengthを見ると、これはもっと明白かもしれません。

> AssocArray.length
0

「連想配列」と呼ばれることが多いのは、実際にはJSの単なるオブジェクトです。

var AssocArray = {};  // <- initialize an object, not an array
AssocArray["a"] = "The letter A"

console.log("a = " + AssocArray["a"]); // "a = The letter A"
JSON.stringify(AssocArray); // "{"a":"The letter A"}"

オブジェクトのプロパティには、配列表記またはドット表記を使用してアクセスできます(キーが予約キーワードではない場合)。したがって、AssocArray.aAssocArray['a']と同じです。

136
Felix Kling

JavaScriptには連想配列はありません。ただし、名前付きプロパティを持つオブジェクトがあるため、new Arrayで「配列」を初期化しないでください。そうすると、それは汎用オブジェクトになります。

7
AndreKR

オブジェクトをオブジェクトとして、配列を配列として保持するのがおそらくベストプラクティスであることに同意しました。ただし、配列として扱う名前付きプロパティを持つオブジェクトがある場合は、次のようにします。

let tempArr = [];
Object.keys(objectArr).forEach( (element) => {
    tempArr.Push(objectArr[element]);
});

let json = JSON.stringify(tempArr);
4
user2245995

これに対する修正を投稿しました こちら

この関数を使用してJSON.stringifyを変更してarraysをエンコードし、スクリプトの先頭近くに投稿するだけです(詳細については上記のリンクを確認してください)。

// Upgrade for JSON.stringify, updated to allow arrays
(function(){
    // Convert array to object
    var convArrToObj = function(array){
        var thisEleObj = new Object();
        if(typeof array == "object"){
            for(var i in array){
                var thisEle = convArrToObj(array[i]);
                thisEleObj[i] = thisEle;
            }
        }else {
            thisEleObj = array;
        }
        return thisEleObj;
    };
    var oldJSONStringify = JSON.stringify;
    JSON.stringify = function(input){
        if(oldJSONStringify(input) == '[]')
            return oldJSONStringify(convArrToObj(input));
        else
            return oldJSONStringify(input);
    };
})();
1
JVE999