プログラミング

PythonでJSONを文字列に変換するには?json.dumpsも解説!(JSON変換:文字列化:シリアライズ:辞書変換:dumps・loadsなど)

当サイトでは記事内に広告を含みます

Pythonでデータをやり取りする際、JSON形式への変換は欠かせない操作のひとつです。WebAPIとの通信、設定ファイルの保存、データのシリアライズなど、PythonのオブジェクトをJSON文字列に変換するスキルは実務で非常に重要です。

Pythonには標準ライブラリとしてjsonモジュールが用意されており、json.dumps()を使えばPythonの辞書やリストを簡単にJSON文字列に変換できます。逆にJSON文字列をPythonオブジェクトに戻すjson.loads()も合わせて知っておくと、データ変換の全体像が把握できます。

この記事では、json.dumps()の基本的な使い方から、インデントの整形・日本語の扱い・エラー対処まで、サンプルコードとともにわかりやすく解説していきます。

PythonでJSONを文字列に変換するにはjson.dumps()を使うのが基本

それではまず、PythonでJSONを文字列に変換する基本的な方法について解説していきます。

Pythonでは標準ライブラリのjsonモジュールをインポートし、json.dumps()にPythonオブジェクトを渡すだけでJSON文字列に変換できます。「dumps」は「dump string」の略で、オブジェクトを文字列として出力する関数です。


import json

# 辞書をJSON文字列に変換
data = {
    "name": "アボカド",
    "price": 298,
    "in_stock": True
}

json_str = json.dumps(data)
print(json_str)
print(type(json_str))

# 出力結果:{"name": "\u30a2\u30dc\u30ab\u30c9", "price": 298, "in_stock": true}
# 出力結果:<class 'str'>

json.dumps()はPythonの辞書・リスト・数値・文字列・真偽値・Noneなどをそのまま渡すだけでJSON文字列に変換してくれます。デフォルトでは日本語がUnicodeエスケープされる点は後ほど解説します。

json.dumps()は「Pythonオブジェクト → JSON文字列」への変換、json.loads()は「JSON文字列 → Pythonオブジェクト」への逆変換です。dumpsとloadsはセットで覚えておきましょう。

PythonとJSONのデータ型対応表

Pythonのデータ型とJSONのデータ型には対応関係があります。変換時に型がどう変わるかを把握しておくと安心です。

Pythonの型 JSONの型 変換例
dict object {“key”: “value”}
list・tuple array [1, 2, 3]
str string “text”
int・float number 42・3.14
True・False true・false true
None null null

リストをJSON文字列に変換する


import json

# リストをJSON文字列に変換
fruits = ["avocado", "dragon_fruit", "salmon"]
json_str = json.dumps(fruits)
print(json_str)

# ネストされた辞書・リストも変換できる
menu = {
    "items": ["keyboard", "mouse", "monitor"],
    "count": 3,
    "available": True
}
print(json.dumps(menu))

# 出力結果:["avocado", "dragon_fruit", "salmon"]
# 出力結果:{"items": ["keyboard", "mouse", "monitor"], "count": 3, "available": true}

ネストされた辞書やリストも問題なく変換できます。PythonのTrueがJSONのtrueに、Falseがfalseにそれぞれ変換される点も確認できます。

json.dumps()の主なオプション一覧

json.dumps()にはいくつかの便利なオプション引数があります。


import json

data = {"product": "gorilla_keyboard", "price": 12800, "stock": 50}

# indent:インデントを追加して整形
print(json.dumps(data, indent=2))

# sort_keys:キーをアルファベット順に並べる
print(json.dumps(data, sort_keys=True))

# separators:区切り文字をカスタマイズ(コンパクト化)
print(json.dumps(data, separators=(",", ":")))

# 出力結果:{
# 出力結果:  "product": "gorilla_keyboard",
# 出力結果:  "price": 12800,
# 出力結果:  "stock": 50
# 出力結果:}
# 出力結果:{"price": 12800, "product": "gorilla_keyboard", "stock": 50}
# 出力結果:{"product":"gorilla_keyboard","price":12800,"stock":50}

indentで見やすく整形、sort_keysでキーを並べ替え、separatorsでスペースを省いたコンパクトなJSON文字列を生成と、用途に応じたオプションが揃っています。

json.dumps()で日本語を正しく扱う方法

続いては、json.dumps()で日本語を含むデータを文字列に変換する際の注意点と対処法を確認していきます。

json.dumps()のデフォルト設定では、日本語などASCII以外の文字はUnicodeエスケープ(\uXXXX形式)に変換されます。日本語をそのまま出力したい場合はensure_ascii=Falseを指定する必要があります。

ensure_ascii=Falseで日本語をそのまま出力する


import json

data = {
    "商品名": "ドラゴンフルーツ",
    "価格": 498,
    "説明": "南国フルーツの代表格"
}

# デフォルト(日本語がエスケープされる)
print(json.dumps(data))

# ensure_ascii=Falseで日本語をそのまま出力
print(json.dumps(data, ensure_ascii=False))

# 出力結果:{"\u5546\u54c1\u540d": "\u30c9\u30e9\u30b4\u30f3\u30d5\u30eb\u30fc\u30c4", ...}
# 出力結果:{"商品名": "ドラゴンフルーツ", "価格": 498, "説明": "南国フルーツの代表格"}

ensure_ascii=Falseを指定するだけで、日本語がそのまま読める形で出力されます。APIのレスポンスや人が読む設定ファイルを生成する際には必須のオプションです。

indent と ensure_ascii=False を組み合わせる


import json

products = [
    {"名前": "サーモン", "価格": 1200, "在庫": True},
    {"名前": "アボカド", "価格": 298, "在庫": False},
    {"名前": "ドラゴンフルーツ", "価格": 498, "在庫": True}
]

# 整形 + 日本語そのまま
json_str = json.dumps(products, ensure_ascii=False, indent=2)
print(json_str)

# 出力結果:[
# 出力結果:  {
# 出力結果:    "名前": "サーモン",
# 出力結果:    "価格": 1200,
# 出力結果:    "在庫": true
# 出力結果:  },
# 出力結果:  ...
# 出力結果:]

ensure_ascii=Falseとindentをあわせて指定することで、日本語が読めてかつ見やすいJSON文字列を生成できます。ログや設定ファイルの出力に最適なパターンです。

JSONファイルに書き出す方法(json.dump)


import json

data = {
    "商品": "キーボード",
    "価格": 8500,
    "メーカー": "ゴリラテック"
}

# json.dump()でファイルに直接書き出す
with open("/home/claude/output.json", "w", encoding="utf-8") as f:
    json.dump(data, f, ensure_ascii=False, indent=2)

# 確認のため読み込む
with open("/home/claude/output.json", "r", encoding="utf-8") as f:
    print(f.read())

# 出力結果:{
# 出力結果:  "商品": "キーボード",
# 出力結果:  "価格": 8500,
# 出力結果:  "メーカー": "ゴリラテック"
# 出力結果:}

ファイルに書き出す場合はjson.dumps()ではなくjson.dump()を使います。第2引数にファイルオブジェクトを渡す点が違いです。文字化けを防ぐためencoding=”utf-8″も忘れずに指定しましょう。

json.loads()でJSON文字列をPythonオブジェクトに変換する方法

続いては、JSON文字列をPythonオブジェクトに変換するjson.loads()の使い方を確認していきます。

json.loads()はJSON文字列を受け取り、Pythonの辞書・リストなどのオブジェクトに変換するデシリアライズの関数です。WebAPIから受け取ったJSONレスポンスの処理などで欠かせません。

json.loads()の基本的な使い方


import json

# JSON文字列をPythonオブジェクトに変換
json_str = '{"name": "avocado", "price": 298, "in_stock": true}'
data = json.loads(json_str)

print(data)
print(type(data))
print(data["name"])
print(data["in_stock"])
print(type(data["in_stock"]))

# 出力結果:{'name': 'avocado', 'price': 298, 'in_stock': True}
# 出力結果:<class 'dict'>
# 出力結果:avocado
# 出力結果:True
# 出力結果:<class 'bool'>

JSONのtrueはPythonのTrueに、falseはFalseに、nullはNoneに自動変換されます。変換後は通常のPython辞書としてキーアクセスができます。

dumps()とloads()を往復させる


import json

# Pythonオブジェクト → JSON文字列 → Pythonオブジェクトの往復
original = {
    "item": "dragon_fruit",
    "tags": ["fruit", "tropical"],
    "count": 5
}

# シリアライズ(Python → JSON文字列)
json_str = json.dumps(original)
print(f"JSON文字列:{json_str}")

# デシリアライズ(JSON文字列 → Python)
restored = json.loads(json_str)
print(f"復元後:{restored}")
print(f"同じ内容か:{original == restored}")

# 出力結果:JSON文字列:{"item": "dragon_fruit", "tags": ["fruit", "tropical"], "count": 5}
# 出力結果:復元後:{'item': 'dragon_fruit', 'tags': ['fruit', 'tropical'], 'count': 5}
# 出力結果:同じ内容か:True

dumps()でJSON文字列にシリアライズしてからloads()でデシリアライズすると元のオブジェクトと同等の内容に復元できます。データの保存・通信・復元の一連の流れを理解するのに役立つパターンです。

JSONファイルを読み込む方法(json.load)


import json

# json.load()でJSONファイルを読み込む
with open("/home/claude/output.json", "r", encoding="utf-8") as f:
    data = json.load(f)

print(data)
print(type(data))

# 出力結果:{'商品': 'キーボード', '価格': 8500, 'メーカー': 'ゴリラテック'}
# 出力結果:<class 'dict'>

ファイルから読み込む場合はjson.loads()ではなくjson.load()を使い、ファイルオブジェクトを渡します。読み込んだ結果は通常のPython辞書として扱えます。

JSON変換のエラー処理と応用パターン

続いては、JSON変換でよく遭遇するエラーの対処法と実践的な応用パターンを確認していきます。

JSON変換ではシリアライズできない型のオブジェクトを渡したり、不正なJSON文字列を解析しようとしたりすることでエラーが発生します。適切なエラー処理を加えることで、堅牢なJSON処理が実現できます。

json.JSONDecodeErrorの対処法


import json

# 不正なJSON文字列をloads()に渡した場合のエラー処理
def safe_loads(json_str):
    try:
        return json.loads(json_str)
    except json.JSONDecodeError as e:
        print(f"JSONパースエラー:{e}")
        return None

result1 = safe_loads('{"name": "gorilla", "age": 5}')
result2 = safe_loads('{"name": "gorilla", "age": }')  # 不正なJSON

print(result1)
print(result2)

# 出力結果:JSONパースエラー:Expecting value: line 1 column 25 (char 24)
# 出力結果:{'name': 'gorilla', 'age': 5}
# 出力結果:None

try-exceptでjson.JSONDecodeErrorを捕捉することで、不正なJSON文字列が渡されてもプログラムがクラッシュしないように対処できます。

シリアライズできない型への対処法


import json
from datetime import datetime

# datetimeはそのままではシリアライズできない
data = {"name": "サーモン", "created_at": datetime(2026, 2, 20)}

# defaultパラメータでカスタム変換を定義
def custom_serializer(obj):
    if isinstance(obj, datetime):
        return obj.strftime("%Y-%m-%d %H:%M:%S")
    raise TypeError(f"シリアライズ不可:{type(obj)}")

json_str = json.dumps(data, default=custom_serializer, ensure_ascii=False)
print(json_str)

# 出力結果:{"name": "サーモン", "created_at": "2026-02-20 00:00:00"}

json.dumps()のdefaultパラメータにカスタム変換関数を渡すことで、datetimeなどデフォルトではシリアライズできない型にも対応できます。

WebAPIのJSONレスポンスを処理する実践例


import json

# WebAPIから受け取ったJSONレスポンスを想定
api_response = '''
{
    "status": "success",
    "data": [
        {"id": 1, "name": "avocado", "price": 298},
        {"id": 2, "name": "dragon_fruit", "price": 498},
        {"id": 3, "name": "salmon", "price": 1200}
    ],
    "total": 3
}
'''

# JSON文字列をパース
result = json.loads(api_response)

# データを取り出して処理
print(f"ステータス:{result['status']}")
print(f"合計件数:{result['total']}")
for item in result["data"]:
    print(f"  ID:{item['id']} / {item['name']} / {item['price']}円")

# 出力結果:ステータス:success
# 出力結果:合計件数:3
# 出力結果:  ID:1 / avocado / 298円
# 出力結果:  ID:2 / dragon_fruit / 498円
# 出力結果:  ID:3 / salmon / 1200円

WebAPIから受け取ったJSON文字列をjson.loads()でパースし、辞書やリストとして扱うのは実務で非常によく使われるパターンです。

まとめ

この記事では、PythonでJSONを文字列に変換する方法について、json.dumps()の基本・オプション引数・日本語の扱い・json.loads()による逆変換・エラー処理まで幅広く解説しました。

json.dumps()はPythonオブジェクトをJSON文字列にシリアライズする関数で、ensure_ascii=Falseで日本語をそのまま出力、indentで見やすく整形、sort_keysでキーを並べ替えるといったオプションが使えます。逆変換にはjson.loads()を使い、ファイルへの読み書きにはjson.dump()・json.load()が対応します。

JSON変換はWebAPI・設定ファイル・データ保存など様々な場面で活躍します。今回紹介したパターンをベースに、実際のプロジェクトでどんどん活用してみてください。

json.dumps()で日本語を扱う際はensure_ascii=Falseを忘れずに指定しましょう。デフォルトではUnicodeエスケープされてしまいます。また、datetimeなどシリアライズできない型にはdefaultパラメータでカスタム変換関数を定義することで対応できます。