Kuzunoha-NEのブログ

プログラミングなどの勉強をしてます

【Python】 インスタンス変数を辞書型で出力 + JSON形式で文字列にする。

こんばんは、葛の葉です。

Pythonインスタンス変数を辞書型で出力する方法とそれをJSONに変換する方法を記載します。

環境

Python 3.6.5

こんな感じ

class MyClass(object):
    def __init__(self, name):
        self.name = name
        self.gender = 'male'
        self._address = '192-1999'
        self.interest = ['Kemono Friends', 'DoDonpachi', 'Python']
        self.age = 111

myclass = MyClass('kuzunoha')

このようにクラスとインスタンスを作成する。

print(myclass.__dict__)

myclass.__dict__インスタンス変数を辞書型として持っている。

{'name': 'kuzunoha', 'gender': 'male', '_address': '192-1999', 'interest': ['Kemono Friends', 'DoDonpachi', 'Python'], 'age': 111}

JSON形式文字列にする。

内部modulejsonjson.dumpsを使ってJSON型にする。

import json # ここ追加になっている点に注意

class MyClass(object):
    def __init__(self, name):
        self.name = name
        self.gender = 'male'
        self._address = '192-1999'
        self.interest = ['Kemono Friends', 'DoDonpachi', 'Python']
        self.age = 111

    def to_json(self):
        return json.dumps(self.__dict__, ensure_ascii=False, indent=4) 

myclass = MyClass('kuzunoha')

json.dumps(self.__dict__, ensure_ascii=False, indent=4)jsonモジュールを使って辞書型をjsonに変更しています。

オプションのensure_ascii=Falseはこれを打たないとバイト文字になってしまうので、そのようにしています。

indent=4はインデントを空白4つで自動で行ってくれます。自動ってすごい。かしこい。

print(myclass.to_json())で出力してみましょう。

{
    "name": "kuzunoha",
    "gender": "male",
    "_address": "192-1999",
    "interest": [
        "Kemono Friends",
        "DoDonpachi",
        "Python"
    ],
    "age": 111
}

上記の通り出ている。けれども、少し問題なのがアンダースコア_で定義したインスタンス変数もそのまま出力されている点かも?

それが嫌なら、一度、インスタンス変数の辞書をコピーして、そこから_addressを抜き取ってみる?

    def to_json(self):
        dicts = self.__dict__.copy()
        # 以下の要素はjsonには要らないので削除
        dicts.pop('_address')

        return json.dumps(dicts, ensure_ascii=False, indent=4)
myclass = MyClass('kuzunoha')

print(myclass.to_json())

{
    "name": "kuzunoha",
    "gender": "male",
    "interest": [
        "Kemono Friends",
        "DoDonpachi",
        "Python"
    ],
    "age": 111
}