みーのぺーじ

みーが趣味でやっているPCやソフトウェアについて.Python, Javascript, Processing, Unityなど.

Pydantic で JSON を読み込む時に型変換される

例えば dict[int, int] を JSON で記述しようとすると,キーは文字列にする必要がありますが,Pydantic がうまく型変換してくれるので気にせず使えて便利です.

% python --version
Python 3.11.6
% pip freeze
pydantic==2.5.2

test_pydantic.py

import json
import unittest

from pydantic import BaseModel


class A(BaseModel):
    str_dict: dict[str, int]
    int_dict: dict[int, int]


class ATest(unittest.TestCase):
    def test_load_json(self):
        with self.assertRaises(json.JSONDecodeError):
            json.loads("{1:1}")

    def test_dict_equal(self):
        self.assertEqual({1: 1}, {1: 1})
        self.assertNotEqual({1: 1}, {"1": 1})

    def test_a(self):
        a = A(**json.loads('{"str_dict":{"1":1},"int_dict":{"1":"1"}}'))
        self.assertEqual(a.str_dict, {"1": 1})
        self.assertEqual(a.int_dict, {1: 1}) # <- 型変換

test_load_json 関数では,int 型のキーを持つ object は不正な JSON 形式であることを確認しています.

test_dict_equal 関数では,念のため,Python の比較について動作確認しています.

test_a 関数では,JSON形式で {"1":"1"} が,Python で {1: 1} に型変換されていることを確認しています.

% python -m unittest tests.test_pydantic   
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK

Pydantic は柔軟に使えるよう設計されており,気に入りました.