用語比較
jsonとpickleの違い|保存できる範囲と安全性をPython3エンジニア認定基礎試験で判断する
jsonはリストや辞書のような単純なデータを、テキストとして保存・交換するための形式です。pickleは複雑な構造のPythonオブジェクトもシリアライズできるプロトコルですが、Pythonに固有で、デフォルトでは安全ではありません。公式チュートリアル7.2.2は、この対比を「参考」として示しています。
Python 3 エンジニア認定基礎試験では、jsonモジュールとpickleのどちらが、他の言語で書かれたアプリケーションとの通信に使えるか、信頼できない入手元のデータを読み込むと何が起きるかを選ぶ問題が想定されます。関数の使い分け(dump・dumps・load)とあわせて確認します。
このページは、jsonとpickleを「どちらもオブジェクトを保存する仕組み」とだけ覚えている人を対象にしています。扱える範囲、相手の言語、読み込み時の危険性という3つの軸で、公式チュートリアルの記載を整理します。
この記事の目次
この記事の根拠と出典
各セクションの見出しの下に、公式資料で確認した内容か編集部の整理かをラベルで示しています。 試験日・料金・申込条件・試験方式は変わることがあるため、申込前に公式サイトで確認してください。Python3エンジニア認定基礎試験の一次情報確認日: 2026-09-18。
結論
json
リストや辞書を文字列やテキストファイルにシリアライズする。dumps()は文字列を返し、dump()はテキストファイルへ書き、load()は読み戻す。
pickle
複雑な構造のPythonオブジェクトもシリアライズできるが、Python固有で他の言語との通信には使えず、デフォルトでは安全ではない。
違いを表で確認
| 比較軸 | json | pickle |
|---|---|---|
| 扱えるオブジェクト | リストや辞書のような単純なもの。任意のクラス・インスタンスをJSONにするにはもう少し努力が必要 | 複雑な構造のPythonオブジェクトもシリアライズできる |
| 他の言語との通信 | 公式チュートリアルは、pickleを「JSONとは対照的に」Python固有と述べており、jsonにはこの制限を付けていない | Pythonに固有で、他の言語で書かれたアプリケーションとの通信には使えない |
| 信頼できないデータの読み込み | 公式チュートリアルは、この注意をpickle側にだけ書いている | デフォルトでは安全ではない。信頼できない入手元のデータをデシリアライズすると、細工されたデータにより任意のコードが実行される可能性がある |
| 文字エンコーディング | JSONファイルは、テキストファイルのデフォルトのエンコーディングであるUTF-8でエンコードする必要がある | 公式チュートリアル7.2.2は、pickleのエンコーディングには触れていない |
| チュートリアルが示す関数の例 | json.dumps(x) は [1, "simple", "list"] を '[1, "simple", "list"]' にする | 具体的な関数は示されず、pickleモジュールのリファレンスが案内されている |
Python3エンジニア認定基礎試験の学習に使う書籍(Amazon)
試験範囲を通して読むときの1冊です。読んだ章は、このサイトの章別問題で確かめられます。
どこで迷っているかを切り分ける
どちらを選んでも同じだと考える人
公式チュートリアル7.2.2は、pickleをJSONと対比し、Python固有で他の言語との通信には使えないと説明しています。他の言語のアプリケーションと受け渡すデータには使えません。
ファイルから読み込むデータだから安全だと考える人
pickleは、デフォルトでは安全ではありません。信頼できない入手元のpickleデータをデシリアライズすると、熟練した攻撃者が細工したデータで任意のコードが実行される可能性があります。
自作クラスのインスタンスをそのままJSONにしようとする人
公式チュートリアルは、リストや辞書は扱えるが、任意のクラス・インスタンスをJSONにシリアライズするにはもう少し努力が必要だと説明しています。jsonモジュールのリファレンスに解説があります。
問題文から答えを選ぶ手順
- 1
保存したいデータの形を確認する
リストや辞書のような単純なデータなら、jsonで扱えます。複雑な構造のPythonオブジェクトなら、pickleが挙げられています。
- 2
受け取る相手を確認する
他の言語で書かれたアプリケーションと通信するなら、Python固有のpickleは使えません。
- 3
データの入手元を確認する
信頼できない入手元のpickleデータはデシリアライズしてはいけません。任意のコードが実行される可能性があるためです。
- 4
文字列で受け取るか、ファイルで受け取るかを確認する
json.dumps()は文字列を返し、json.dump()はテキストファイルにシリアライズします。読み戻しはjson.load()です。
試験での見分け方
- 1jsonはリストや辞書のような単純なデータを扱い、任意のクラス・インスタンスには追加の対応が要る。
- 2pickleは複雑な構造のPythonオブジェクトをシリアライズできるが、Python固有である。
- 3pickleは他の言語で書かれたアプリケーションとの通信には使えない。
- 4pickleは、デフォルトでは安全ではなく、信頼できない入手元のデータはデシリアライズしない。
- 5json.dumps()は文字列、json.dump()はテキストファイルへのシリアライズ、json.load()はデシリアライズである。
誤答しやすい選択肢
pickleを他の言語とのデータ交換に選ぶ
修正: 公式チュートリアル7.2.2は、pickleはPythonに固有であり、他の言語で書かれたアプリケーションとの通信には使えないと説明しています。
信頼できないpickleデータを読み込んでも、データが読めるだけだと考える
修正: デシリアライズにより、細工されたデータで任意のコードが実行される可能性があります。入手元を確認します。
JSONにするとPythonの値がそのまま文字になると考える
修正: Python 3.9.6で json.dumps({'a': 1, 'b': None, 'c': True}) は '{"a": 1, "b": null, "c": true}' を返します。NoneはnullへTrueはtrueへ変わります。dump()とdumps()の違いは別ページで確認できます。
JSONのエンコーディングを何でもよいと考える
修正: 公式チュートリアルは、JSONファイルはテキストファイルのデフォルトのエンコーディングであるUTF-8でエンコードする必要があると注記しています。
確認問題
Q1他の言語で書かれたアプリケーションとの通信に使えないのは、jsonとpickleのどちら?
答え: pickle
公式チュートリアル7.2.2は、pickleはPythonに固有であり、他の言語で書かれたアプリケーションとの通信には使えないと説明しています。
Q2信頼できない入手元のpickleデータをデシリアライズすると何が起きる可能性がある?
答え: 攻撃者により任意のコードが実行される可能性がある
公式チュートリアルは、pickleはデフォルトでは安全ではなく、熟練した攻撃者が細工したデータをデシリアライズすると任意のコードが実行される可能性があると説明しています。
Q3x = [1, 'simple', 'list'] のとき、json.dumps(x) が返すのは?
答え: 文字列 '[1, "simple", "list"]'
dumps()はオブジェクトのJSON形式の文字列表現を返します。公式チュートリアルの例と同じ結果です。
Q4fが読み込み用に開かれたテキストファイルまたはバイナリファイルのとき、デシリアライズに使う式は?
答え: x = json.load(f)
公式チュートリアルは、json.dump(x, f)の逆にデシリアライズするにはjson.load(f)を使うと示しています。
到達チェック
- jsonが単純なデータ、pickleが複雑なPythonオブジェクトを扱うと説明できる
- pickleが他の言語との通信に使えない理由を言える
- 信頼できないpickleデータを読み込む危険性を説明できる
- dumps()・dump()・load()の戻り先を区別できる
関連ページで確認する
同じ資格で次に知りたいこと
- 位置専用引数とキーワード専用引数の違い|/と*の位置をPython3エンジニア認定基礎試験で判断する
位置専用引数とキーワード専用引数の違いを、公式チュートリアルの/と*の書き方、pos_only_argとkwd_only_argの呼び出し例とTypeError、使い分けのガイド、Python 3 エンジニア認定基礎試験での判断手順と確認問題まで解説します。
- listとcollections.dequeの違い|スタックとキューの使い分けをPython3エンジニア認定基礎試験で判断する
listとcollections.dequeの違いを、公式チュートリアル5.1.1・5.1.2のスタックとキューの例、pop()とpopleft()の取り出し順、先頭の操作が低速な理由、Python 3 エンジニア認定基礎試験での判断手順と確認問題まで解説します。
- クラス変数とインスタンス変数の違い|kindとself.nameの区別をPython3エンジニア認定基礎試験で判断する
クラス変数とインスタンス変数の違いを、公式チュートリアルのkind例とself.name例、可変オブジェクトを共有してしまう注意点、Python 3 エンジニア認定基礎試験での判断手順と確認問題まで解説します。
よくある質問
Qjsonとpickleはどちらを使えばいい?
他の言語のアプリケーションと通信するなら、Python固有のpickleは使えません。公式チュートリアル7.2.2は、pickleをJSONとの対比で示しています。
Qpickleはなぜデフォルトで安全でないの?
公式チュートリアルは、信頼できない入手元のpickleデータをデシリアライズすると、熟練した攻撃者が細工したデータにより任意のコードが実行される可能性があると説明しています。
Qjson.dump()とjson.dumps()の違いは?
dumps()はオブジェクトのJSON形式の文字列表現を返し、dump()はオブジェクトをテキストファイルにシリアライズします。
Q自作クラスのインスタンスはjsonで保存できる?
公式チュートリアルは、単純な手法はリストや辞書を扱えるが、任意のクラス・インスタンスをJSONにシリアライズするにはもう少し努力が必要だと説明しています。
次に見る比較
- G検定・DS検定・統計検定2級で重なる用語10語の比較
同じ名前の用語の定義と収録章を、資格ごとに並べます。
- ベイズの定理と条件付き確率の違い(統計検定2級の式と計算例)
求める確率の向きの違いと、陽性になる確率の計算例を確かめます。
- 紛らわしい用語ペア早見表
混同しやすい用語の違いと判定の手掛かりを、資格別の一覧で確かめます。
執筆: ミナト編集部(運営者情報を見る)
