-
Notifications
You must be signed in to change notification settings - Fork 0
MS_JSON
- 戻る(WebAPI、その他、開発の色々(
MS_MiscDevelopmentTopics.md))
JSON とは、
- 軽量なデータ記述言語。
- 構文は JavaScript (ECMAScript) のオブジェクトの表記法をベースとしている。
- JavaScript 専用ではなく、多様なテクノロジ間におけるデータの受け渡しに使える。
- 2006 年 7 月に RFC 4627 で仕様が規定され、
MIME タイプはapplication/json、拡張子はjsonとされた。
補足(最新化): 現行の仕様は RFC 8259(2017 年、STD 90)である。 RFC 4627 → 7159 → 8259 と改訂されており、 RFC 8259 で「交換される JSON テキストは UTF-8 でエンコードしなければならない」 と明確化された。 同内容の標準として ECMA-404 もある。
なお、JSON は JavaScript のサブセット「ではない」時期があった。 U+2028 / U+2029 が JavaScript の文字列リテラル中で使えなかったためで、 これは ES2019 の「JSON superset」提案で解消された。
以下の文字列。
[ ... ][ "aaa", "bbb", "ccc" ]
{ ... }{ "key" : xxx }
常に文字列リテラル(ダブル・クォーテーション)。
- 文字列、数値(十進数の整数、少数、指数)、真偽
- null、オブジェクト、配列
補足: 実務でハマる点を挙げておく。
- 数値の精度: JSON の数値には型の区別が無く、 多くのパーサが IEEE 754 倍精度で扱う。 64bit 整数(
long)の ID をそのまま出すと JavaScript 側で精度が落ちる(2^53 超)。 ID は文字列で送るのが安全である。- キーの重複: 仕様上は「あるべきでない」とされるだけで エラーではなく、パーサ依存で最後勝ち/最初勝ちが分かれる。
- コメントが書けない: 設定ファイル用途では JSONC / JSON5 のような方言が使われる(相互運用性は無い)。
ECMAScript との相違点は以下の 2 点。
- シングル・クォーテーションが対象外
- スラッシュが対象
| 方法 | 内容 |
|---|---|
JSON.parse() |
文字列を解析してオブジェクトにする(JSONのparseを色々試してみた。: MS_JSONParseExperiments.md) |
JSON.stringify() |
オブジェクトを JSON 文字列にする |
eval() |
JSON を解析した結果をオブジェクト型にできるが、少々危険なので JSON.parse() を使用する |
補足:
eval()が危険なのは、 受信した文字列がそのままコードとして実行されるためである。 信頼できないデータでは任意コード実行になる。 歴史的な理由で残っているだけなので、使わないこと。
補足(最新化): .NET の JSON ライブラリは 2 系統ある。
ライブラリ 位置付け System.Text.Json.NET Core 3.0 以降の標準。高速・低アロケーション Newtonsoft.Json(Json.NET)従来の事実上の標準。機能は依然として豊富 移行時の主な差異は次のとおり。
System.Text.Jsonは既定で キャメルケース変換をしない (JsonSerializerOptions.PropertyNamingPolicyで指定する)- 既定で 大文字小文字を区別する (
PropertyNameCaseInsensitive = trueで従来動作)- 既定で コメント・末尾カンマを許可しない
ASP.NET Web API の
CamelCasePropertyNamesContractResolverは Json.NET の機能であり、 ASP.NET Core では既定でキャメルケースになる。
- JSONを送信するRESTサービスを作成する方法(
MS_JSONRestService.md) - JSONを受信するJSON-RPCサービスを作成する方法(
MS_JSONRPCService.md)
JWTは JSON をベースにしたトークン形式である。
- WebAPI
- XML
- CBOR
- JavaScript Object Notation - Wikipedia
- RFC 8259 - The JavaScript Object Notation (JSON) Data Interchange Format
- System.Text.Json での JSON のシリアル化 - Microsoft Learn
Tags: IT国際標準, プログラミング, 通信技術, .NET開発, .NET Core, ASP.NET, ASP.NET Web API
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。