Get to know MDN better
このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。
この機能は広く実装されており、多くのバージョンの端末やブラウザーで動作します。2015年7月以降、すべてのブラウザーで利用可能です。
JSON.stringify() メソッドは、ある JavaScript のオブジェクトや値を JSON 文字列に変換します。置き換え関数を指定して値を置き換えたり、置き換え配列を指定して指定されたプロパティのみを含むようにしたりすることもできます。
JSON 文字列に変換する値です。
replacer 省略可文字列化の手順の挙動を変更する関数、または value のプロパティのうち出力に含めるものを指定する文字列と数値の配列です。この値が配列である場合は、文字列でも数値でもない要素(Symbol 値など)は完全に無視されます。文字列や数値としては、プリミティブでもラッパーオブジェクトでも使用可能です。この値が関数でも配列でもない場合(null の場合や、指定しない場合など)は、結果の JSON 文字列にオブジェクトの文字列をキーとするすべてのプロパティが含まれます。
space 省略可文字列または数値で、出力する JSON 文字列に可読性を目的に空白 (インデントや改行など) を挿入するために使用します。
これが数値のときは、インデントとして使う空白文字の数を示します。この数の上限は 10 です(それより大きい数値は、単に 10 となります)。 1 より小さい値は空白を使わないことを示します。
これが文字列のときは、その文字列(10 文字より長い場合はその最初の 10 文字)がネストされたそれぞれのオブジェクトや配列の前に挿入されます。
これが文字列でも数値でもない場合(文字列や数値としては、プリミティブでもラッパーオブジェクトでも使用可能)、たとえば null や指定しない場合は、空白は使用されません。
与えられた値を表現する JSON 文字列。
以下のいずれかの場合に発生します。
JSON.stringify() は値をそれを表す JSON 表記に変換します。値は以下のように変換されます。
Boolean、 Number、 String、および (Object() により得られる) BigInt の各オブジェクトは、文字列化の際に慣習的な変換セマンティクスに従い、対応するプリミティブ値に変換されます。(Object() により得られる) Symbol のオブジェクトは、プレーンオブジェクトとして扱われます。
BigInt の値を文字列化しようとすると、例外が発生します。しかし、BigInt が (モンキーパッチ BigInt.prototype.toJSON = ... により) toJSON() メソッドを持っている場合、このメソッドにより文字列化できます。この制約により、適切な文字列化の方法(そして、ほとんどの場合、対応する逆変換の方法)が常にユーザーによって明示されるようにします。
undefined、関数 (Function)、シンボル (Symbol) は有効な JSON 値ではありません。変換中にそのような値に遭遇した場合は、(オブジェクトの中で発見された場合は) 省略されたり、(配列の中で見つかった場合は) null に変換されたりします。 JSON.stringify() は JSON.stringify(() => {}) や JSON.stringify(undefined) のように「純粋」な値を渡した場合に undefined を返すことがあります。
Infinity および NaN の数値は、 null の値と同様に、すべて null と見なされます。(ただし、前述の値と違って、省略されることはありません)
配列は配列として(角括弧で囲まれ)文字列化されます。 0 から length - 1 までの添字 (両端を含みます) が文字列化され、他のプロパティは無視されます。
JSON.rawJSON() で作成した特殊な生の JSON オブジェクトは、(その rawJSON プロパティにアクセスすることで)それを含む生の JSON テキストとしてシリアライズされます。
その他のオブジェクトについては、以下の通りです。
シンボル (Symbol) がキーとなっているプロパティはすべて、引数 replacer を使用する場合でも完全に無視されます。
値が toJSON() メソッドを持っている場合は、それがデータをどう文字列化するかを決定します。オブジェクトを文字列化するかわりに、toJSON() メソッドが返す値が文字列化されます。JSON.stringify() は toJSON を 1 個の引数 key を指定して呼び出します。この引数は、replacer 関数と同じ以下の仕様です。
すべての Temporal のオブジェクトは toJSON() メソッドを実装しており、これは文字列を返します(toString() の呼び出しと同様)。したがって、これは文字列としてシリアライズされます。同様に、Date オブジェクトも toJSON() を実装しており、これは toISOString() と同じものを返します。
列挙可能なプロパティのみが文字列化されます。そのため、Map、Set、WeakMap、WeakSet などは "{}" に変換されます。引数 replacer を用いることで、これらをより実用的なものに変換できます。
プロパティは、Object.keys() と同じアルゴリズムで走査されます。このアルゴリズムは、完全に定義された順番を用い、実装間で一貫性があります。例えば、JSON.stringify() を同じオブジェクトに対して用いると、常に同じ文字列を生成します。また、JSON.parse(JSON.stringify(obj)) は (オブジェクトが完全に JSON に変換可能であると仮定すると) もとのオブジェクトと同じキーの順番を持つオブジェクトを生成します。
replacer 引数は関数または配列です。
配列の場合、その要素は結果の JSON 文字列に含めるオブジェクトのプロパティの名前を表します。文字列と数値である値のみが処理に用いられ、シンボルのキーは無視されます。
関数の場合、 key と文字列化される value の 2 つの引数を取ります。キーをもつオブジェクトが replacer のコンテキストで this として提供されます。
replacer 関数は、まず文字列化されるオブジェクトについて呼び出され、このときの key は空文字列 ("") です。その後、文字列化されるオブジェクトや配列のそれぞれのプロパティについて呼び出されます。配列の添字は、文字列として key に入ります。処理中のプロパティの値は、文字列化において replacer の返値に置き換えられます。すなわち:
メモ: replacer 関数を用いて生成した JSON を解釈する際は、逆変換のために引数 reviver を用いたくなる可能性が高いでしょう。
通常、配列の要素の添字はずれません(要素が関数などの無効な値である場合も、省略されるのではなく null になります)。replacer 関数を用いると、別の配列を返すことで、配列の要素の順番を制御できます。
space 引数で最終的な文字列での空白の数を調整できます。
インデントの階層が 10 より長くなることはありません。space の値が数値の場合は最大 10 となり、文字列の場合は 10 文字に切り詰められます。
replacer で最初のオブジェクトと空文字列をキーとするプロパティを区別したい場合は、(両方の場合において key は空文字列となり、value はオブジェクトを取りうるので) 繰り返しの回数の記録が必要になるでしょう(最初の繰り返しより後の場合、本当に空文字列のキーです)。
出力を空白 1 つでインデントします。
タブ文字を使うと、標準的な表示の整形と同様になります。
オブジェクトに toJSON() を定義することで、シリアライズの挙動をオーバーライドできます。
JSON 形式はオブジェクト参照に対応していないため(IETF 草稿はありますが)、循環参照のあるオブジェクトをエンコードしようとすると TypeError が発生します。
循環参照をシリアライズするためには、これに対応したライブラリを使用したり (Douglas Crockford による cycle.js など)、自分自身で解決策を実装したりする方法があります。循環参照を探索してシリアライズされた値に置き換える (または削除する) 必要があるでしょう。
JSON.stringify() をオブジェクトをディープコピーするために使っている場合は、かわりに structuredClone() を使いたくなるかもしれません。この関数は循環参照に対応しています。v8.serialize() などのバイナリーシリアライズを行う JavaScript エンジンの API も、循環参照に対応しています。
ユーザーが作成したオブジェクトを格納し、ブラウザーが閉じた後に復元できるようにしたい場合は以下の例が JSON.stringify() を適用した模範例です。
well-formed JSON.stringify 仕様を実装しているエンジンは、サロゲート文字、U+D800 から U+DFFF までのすべてのコードポイントを、リテラルではなく Unicode エスケープシーケンスを使用して文字列化します。この変更前は、このような文字列は妥当な UTF-8 または UTF-16 でエンコードされていませんでした。
しかし、この変更で JSON.stringify() は孤立サロゲートを JSON エスケープシーケンスによって表すようになり、妥当な UTF-8 または UTF-16 でエンコードすることができるようになりました。
この変更では、サロゲート文字の Unicode エスケープをサロゲート文字と同一のものとして扱うため、 JSON.stringify() の結果を、JSON テキストを妥当である限りどのようなものでも受け付ける JSON.parse() のような API に渡したときに後方互換性があります。JSON.stringify() の結果を直接解析する場合のみ、JSON.stringify() がこれらのコードポイントに対して 2 通りのエンコーディングをする可能性があることに注意して扱う必要があります。
| ECMAScript® 2027 Language Specification # sec-json.stringify |
ブラウザー互換性一覧表を表示するには、JavaScript を有効にしてください。
より良いインターネットのための青写真。
このコンテンツの一部は、©1998–2026 個人の mozilla.org 協力者です。コンテンツはクリエイティブ・コモンズ・ライセンスのもとで利用できます。