JSON

[up] [prev] [next]

目次

JSONの概要

JSON は JavaScript Object Notation の略で、JavaScript におけるオブジェクト記法をベースとするデータ記述言語です。現在では、JavaScript に限らず、様々な言語間のデータ交換などで用いられています。詳細は 「JSON入門」 を参照してください。

エンコードとデコード

JSON.stringify(object[, replacer[, space]])

オブジェクトを JSON文字列にエンコードします。

JavaScript
var obj = {x: 123, y: 234};
var str = JSON.stringify(obj);
console.log(str);                    // => {"x":123, "y":234}

replacer は関数または配列です。関数の場合、関数は keyvalue を受け取り、必要に応じて値を変換し、返却します。undefined を返却した場合、そのキーと値のペアは、文字列へのエンコードから除外されます。下記の場合、変換関数は key="", value={x:123, y:234}, key="x", value=123, key="y", value=234 の 3回呼ばれることに注意してください。

JavaScript
function replacer(key, value) {
    return typeof value === "number" ? value * 2 : value;
}
var obj = {x: 123, y: 234};
var str = JSON.stringify(obj, replacer);
console.log(str);                    // => {"x":246, "y":468}

replacer に配列を指定した場合は、配列に含まれるキーのみが JSON文字列にエンコードされます。

JavaScript
var obj = {x: 123, y: 234};
var str = JSON.stringify(obj, ["x"]);
console.log(str);                    // => {"x":123}

space には JSON の可読性を高めるための数値または文字列を指定します。1以上の数値を指定した場合、JSON文字列は改行され、数値個数分の空白文字でインデントされます。文字列(通常は空白文字かタブ文字)を指定した場合、JSON文字列は改行され、指定した文字列でインデントされます。

JavaScript
var obj = {x: 123, y: 234};
console.log(JSON.stringify(obj, null, 2));
console.log(JSON.stringify(obj, null, "  "));
JSON.parse(text[, reviver])

JSON文字列をオブジェクトにデコードします。

JavaScript
var str = '{"x": 123, "y": 234}';
var obj = JSON.parse(str);
console.log(obj);                    // => {x: 123, y: 234}

reviverkeyvalue を受け取る変換関数で、デコードの際に値を変換することができます。下記の場合、変換関数は key="x", value=123, key="y", value=234, key="", value={x:123, y:234} の 3回呼ばれます。

JavaScript
function reviver(key, value) {
    return typeof value === 'number' ? value * 2 : value;
}
var str = '{"x": 123, "y": 234}';
var obj = JSON.parse(str, reviver);
console.log(obj);                    // => {x: 246, y: 468}

Unicodeの扱い

JSON superset

JSON規格(RFC 8259)では U+2028(LINE SEPARATOR) と U+2029(PARAGRAPH SEPARATOR) を通常文字として扱うのに対し、JavaScript 文字列ではこれらをメタ文字として扱い、"\u2028", "\u2029" と表記するか、バックスラッシュでエスケープする必要がありました。ES2019(ES10) では、JSON規格に合わせてこの2文字をエスケープ不要としました。これにより、JavaScript はJSON規格の完全なスーパーセット(上位互換)となりました。

JavaScript
// JSONスーパセット化対応ブラウザでは true を返す
// JSONスーパセット化未対応ブラウザでは SyntaxError となる
console.log(eval('"\u2028"') === "\u2028");
Well-formed JSON.stringify

Unicode のサロゲートペア文字(U+10000~U+10FFFF)は、UTF-8 では上位サロゲート(\uD800~\uDBFF)と下位サロゲート(\uDC00~\uDFFF)のペアで表現されます。上位のみ、下位のみ、上位と下位が逆転など、サロゲートペア文字として成立していない文字が来た場合、片方だけでも無理矢理 "\uXXXX" の形式に変換していましたが、ES2019(ES10) では JSON 規格として正しい文字列になるように、"\\uXXXX" の形式にエンコードするようになりました。

JavaScript
// 上位のみ。対応ブラウザでは true、非対応ブラウザでは false
console.log(JSON.stringify('\uD834') === '"\\ud834"');
// 下位のみ。対応ブラウザでは true、非対応ブラウザでは false
console.log(JSON.stringify('\uDF06') === '"\\udf06"');
// 上位と下位が逆転。対応ブラウザでは true、非対応ブラウザでは false
console.log(JSON.stringify('\uDF06\uD834') === '"\\udf06\\ud834"');

[up] [prev] [next]
Copyright (C) 2019 杜甫々
改訂版初版:2019年12月1日、最終更新:2019年12月1日
http://www.tohoho-web.com/js/json.htm