{}const=>[]async()letfn</>var
開発

JSONとデータのシリアル化:開発者向けの完全ガイド

JSON の完全ガイド:基本的な操作から高度なシリアル化テクニックまで。Python、JavaScript、その他の言語でデータを効率的に処理し、パフォーマンスを最適化し、セキュリティを確保し、大量の情報を処理する方法を学びます。

К

Kodik

著者

1分で読める

JSON(JavaScript Object Notation)は、現代のWeb開発における事実上のデータ交換標準となっています。そのシンプルさ、読みやすさ、汎用性により、どのような開発者にとっても不可欠なツールとなっています。JSONの正しい使い方と、データのシリアル化における落とし穴について見ていきましょう。

JSONが世界を席巻した理由は?

2000年代初頭、Web開発者はXMLを使用してクライアントとサーバー間でデータをやり取りしていました。XMLは煩雑で、解析に多くのスペースと時間がかかりました。2001年、ダグラス・クロックフォードはJSONを軽量な代替案として提案し、ゲームのルールを変えました。

JSONはJavaScriptのサブセットに基づいているため、Webアプリケーションの自然な選択肢です。しかし、その利点はJavaScriptをはるかに超えています。JSONは、PythonからGo、JavaからRustまで、ほぼすべての最新のプログラミング言語でサポートされています。

🔥 10万人以上の学生が参加中

理論を読むのに疲れた?
コーディングの時間だ!

Kodik — 実践でプログラミングを学ぶアプリ。AIメンター、インタラクティブなレッスン、実際のプロジェクト。

🤖 AI 24時間
🎓 修了証
💰 無料
🚀 始める
今日参加


さまざまな言語でのJSONの操作の基礎

Pythonでは、組み込みのjsonモジュールのおかげで、JSONの操作は非常に簡単です。PythonオブジェクトのJSON文字列へのシリアル化はdumpsメソッドによって実行され、逆シリアル化はloadsによって実行されます。すべての Python データ型が JSON に直接シリアル化できるわけではないことを理解することが重要です。たとえば、datetimeオブジェクト、セット、またはカスタムクラスには追加の処理が必要です。

JavaScript では、JSON は組み込みオブジェクトであり、直感的に操作できます。JSON.stringify メソッドは JavaScript オブジェクトを文字列に変換し、JSON.parse は JSON 文字列を解析してオブジェクトに戻します。ただし、ここにもニュアンスがあります。関数、未定義、および文字はシリアル化時に失われ、予期しない結果につながる可能性があります。

Java や C# などの厳密に型指定された言語では、JSON を操作するには Jackson、Gson、System.Text.Json などの特別なライブラリを使用する必要があります。これらのライブラリは、JSONとクラスオブジェクト間のマッピングメカニズムを提供し、プロセスをタイプセーフにしますが、追加の設定が必要です。

高度なシリアライゼーション技術

一般的なタスクの1つは、JSONで直接サポートされていない複雑なオブジェクトをシリアル化することです。Python では、JSONEncoder から継承し、default メソッドを上書きすることで、カスタム エンコーダーを作成できます。これにより、日付、時刻、小数点、さらにはカスタムクラスをエレガントに処理できます。

実例を考えてみましょう。登録日と残高がDecimalのユーザーオブジェクトがあります。標準のjson.dumpsはTypeErrorエラーを引き起こします。解決策は、これらのタイプをJSON互換フォーマットに変換する方法を知っているカスタムエンコーダーを作成することです。日付は ISO 文字列に変換でき、小数点は通常の数値または文字列に変換して精度を維持できます。

JavaScript では、JSON.stringify の 2 番目のパラメーターである replacer 関数を使用して、シリアル化する前に値を変換できます。これは、機密データをフィルタリングしたり、特定のタイプを変換したりするための強力なツールです。

パフォーマンスと最適化

大量のデータに関しては、シリアル化のパフォーマンスが非常に重要になります。Python には、ujson (UltraJSON) や orjson などの標準的な json モジュールの代替手段があり、C 実装により数倍高速になる可能性があります。

重要なポイント:インデントと改行を含む美しくフォーマットされたJSONは、より多くのスペースを占め、解析が遅くなります。プロダクションでは、余分なスペースなしでコンパクトなフォーマットを使用することをお勧めします。Python では、これは separators パラメータとインデントなしで達成され、JavaScript では、追加のパラメータなしで JSON.stringify を呼び出すだけです。

JSON のストリーミングは、大きなファイルを処理するためのもう 1 つの最適化テクニックです。すべてのJSONをメモリにロードする代わりに、PythonのijsonやNode.jsのstream-jsonなどの特別なライブラリを使用して、JSONを部分的に処理できます。

JSON を使用した作業時の安全性

JSON は、処理方法が間違っていると、攻撃ベクトルになる可能性があります。古典的な問題の1つは、攻撃者が保護されていないフィールドを介して悪意のあるデータを挿入するJSONインジェクションです。パースする前に、常に受信データを検証してサニタイズしてください。

もう 1 つの危険は、信頼できないデータを逆シリアル化すると、任意のコードが実行される可能性があることです。Python では、簡単な解決策のように見える場合でも、JSON の解析にeval を使用しないでください。常に json.loads を使用してください。これは文字列を安全に処理します。

受信 JSON のサイズを制限することは、DoS 攻撃に対する必須の防御策です。攻撃者は、サーバーのメモリを使い果たす巨大なJSONファイルを送信する可能性があります。Webサーバーまたはアプリケーションレベルでリクエストボディのサイズ制限を設定します。

JSONのスキーマと検証

JSONスキーマは、JSONデータの構造を記述するための標準です。これにより、どのフィールドが必須であるか、どのデータ型が期待されるか、どの制限が値に課されるかを決定できます。これは、クライアントとサーバーがデータ形式に同意する必要があるAPIでは特に重要です。

Python では、人気のある jsonschema ライブラリを使用して、JSON をスキーマに対して検証できます。JavaScriptでは、最速のJSONスキーマバリデータの1つであるAjvを使用できます。入力検証は、不正なデータがシステムに入るのを防ぎ、デバッグ時間を節約します。

TypeScript や Pydantic などの最新ツールは、JSON スキーマから自動的にタイプを生成したり、その逆も可能にすることで、さらに一歩前進しています。これにより、データ構造の単一の信頼できる情報源が作成され、ドキュメントと実際のコードとの間の不一致の可能性が減少します。

JSONの代替案

JSONは人気がありますが、必ずしも最適なものではありません。負荷の高いシステムでは、プロトコル バッファ、MessagePack、BSON などのバイナリ形式を検討することをお勧めします。人間が読みやすいものではありませんが、占有するスペースが少なく、解析も速くなります。

MessagePackは、データ型でJSONと完全に互換性がありますが、バイナリ表現を使用するため、特に興味深いものです。MessagePackに移行する場合、多くの場合、アプリケーションのロジックを変更する必要はなく、シリアル化ライブラリを置き換えるだけです。これにより、大量のデータを処理する際のパフォーマンスが最大50%向上する可能性があります。

YAML は、表現力と読みやすさのために速度を犠牲にするもう 1 つの選択肢です。構成ファイルには最適ですが、解析が遅いため、リアルタイムのデータ転送には使用しないことをお勧めします。

実践パターンとベストプラクティス

JSON APIを設計する際には、命名規則に従うことが重要です。JavaScript では camelCase を、Python では snake_case を使用するのが一般的です。1 つのスタイルを選択し、プロジェクト全体でそれを維持することが重要です。一部のコマンドは、レイヤー間の境界で名前を自動的に変換することでこの問題を解決します。

構造のネストは両刃の剣です。深くネストされた JSON オブジェクトは、読み取りや処理が困難です。data.user.profile.settings.notifications.emailのような長いチェーンを介して定期的にデータにアクセスすることがわかった場合は、データ構造を見直してフラットにすることを検討してください。

JSON を介した API のバージョン管理は非常に重要な慣行です。JSON自体にバージョンを含めるか、HTTPヘッダーを使用します。これにより、既存のクライアントを壊すことなく、破壊的な変更を加えることができます。たとえば、オブジェクトのルートにあるバージョンフィールドは、どのような構造を期待するかを示すことができます。

ビッグデータの処理

JSONファイルがギガバイト単位で測定されると、従来のアプローチは機能しなくなります。JSON Lines(JSONL)は、ファイルの各行に個別のJSONオブジェクトが含まれる形式です。これにより、ファイル全体をメモリにロードすることなく、ファイルを1行ずつ処理できます。

JSON ストリーミングも重要です。すべてのデータをメモリに蓄積して最終レコードを作成する代わりに、データが生成されるたびに JSON を書き込むことができます。これは、結果が RAM に収まらない可能性のあるデータベースからのデータのエクスポートに特に当てはまります。

JSON 圧縮は、送信されるデータのサイズを大幅に縮小できます。Gzipは、テキストの性質とキーの繰り返しにより、JSONをうまく処理します。ほとんどのWebサーバーはgzip圧縮を自動的にサポートしていますが、有効になっていることを確認することが重要です。

コディック — 初心者向けのPython、JavaScript、Web開発コースを提供する教育プラットフォーム。

私たちの Telegramチャンネル、ここでは役立つ資料、複雑なトピックの分析、プログラマーのアクティブなコミュニティのサポートを見つけることができます。

私たちと一緒に学び、知識を実用的なコードに変えましょう!

🎯先延ばしをやめよう

記事は気に入った?
実践の時間だ!

Kodikでは読むだけでなく、すぐにコードを書く。理論 + 実践 = 本当のスキル。

即座に実践
🧠AIがコードを説明
🏆修了証

登録不要 • カード不要