AI資格ドリル
資格を選ぶ↓

用語比較

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固有で他の言語との通信には使えず、デフォルトでは安全ではない。

違いを表で確認

比較軸jsonpickle
扱えるオブジェクトリストや辞書のような単純なもの。任意のクラス・インスタンスを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冊です。読んだ章は、このサイトの章別問題で確かめられます。

PR

ほかの資格を含む参考書・問題集の一覧を見る

どこで迷っているかを切り分ける

01

どちらを選んでも同じだと考える人

公式チュートリアル7.2.2は、pickleをJSONと対比し、Python固有で他の言語との通信には使えないと説明しています。他の言語のアプリケーションと受け渡すデータには使えません。

02

ファイルから読み込むデータだから安全だと考える人

pickleは、デフォルトでは安全ではありません。信頼できない入手元のpickleデータをデシリアライズすると、熟練した攻撃者が細工したデータで任意のコードが実行される可能性があります。

03

自作クラスのインスタンスをそのままJSONにしようとする人

公式チュートリアルは、リストや辞書は扱えるが、任意のクラス・インスタンスをJSONにシリアライズするにはもう少し努力が必要だと説明しています。jsonモジュールのリファレンスに解説があります。

問題文から答えを選ぶ手順

  1. 1

    保存したいデータの形を確認する

    リストや辞書のような単純なデータなら、jsonで扱えます。複雑な構造のPythonオブジェクトなら、pickleが挙げられています。

  2. 2

    受け取る相手を確認する

    他の言語で書かれたアプリケーションと通信するなら、Python固有のpickleは使えません。

  3. 3

    データの入手元を確認する

    信頼できない入手元のpickleデータはデシリアライズしてはいけません。任意のコードが実行される可能性があるためです。

  4. 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()の戻り先を区別できる

同じ資格で次に知りたいこと

よくある質問

Qjsonとpickleはどちらを使えばいい?

A

他の言語のアプリケーションと通信するなら、Python固有のpickleは使えません。公式チュートリアル7.2.2は、pickleをJSONとの対比で示しています。

Qpickleはなぜデフォルトで安全でないの?

A

公式チュートリアルは、信頼できない入手元のpickleデータをデシリアライズすると、熟練した攻撃者が細工したデータにより任意のコードが実行される可能性があると説明しています。

Qjson.dump()とjson.dumps()の違いは?

A

dumps()はオブジェクトのJSON形式の文字列表現を返し、dump()はオブジェクトをテキストファイルにシリアライズします。

Q自作クラスのインスタンスはjsonで保存できる?

A

公式チュートリアルは、単純な手法はリストや辞書を扱えるが、任意のクラス・インスタンスをJSONにシリアライズするにはもう少し努力が必要だと説明しています。

次に見る比較

執筆: ミナト編集部(運営者情報を見る)