Python将JSON转换为Python对象

2024-09-27 00:21:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下代码。在LegoThemes“saveThemes()”类中,我进行了一次JSON转储,输出为一个.JSON文件——这非常有效(感谢另一个线程上的帮助!)。但是,当我实现LoadThemes()方法时,它当前只是将python加载到self.\uu主题中。然而,我想做的是为文件“themes.JSON”中的每个JSON条目创建一个LegoTheme对象

import json


class LegoThemes:
    def __init__(self):
        self.__themes = []
        self.loadThemes()

    def saveThemes(self):
        with open("themes.json", "w") as themesStorageFile:
            json.dump([t.__dict__ for t in self.__themes], themesStorageFile, indent=4)

    def loadThemes(self):
        with open("themes.json") as themesStorageFile:
            self.__themes = json.load(themesStorageFile)

    def addTheme(self, theme):
        self.__themes.append(theme)
        self.saveThemes()

    def getThemeTitlesList(self):
        themeTitlesList = []
        for theme in self.__themes:
            print(theme)


class LegoTheme:
    def __init__(self, title, description, thumbnailImage, logoImage, url):
        self.__title = title
        self.__description = description
        self.__thumbnailImage = thumbnailImage
        self.__logoImage = logoImage
        self.__url = url

    def getTitle(self):
        return self.__title


legoThemes = LegoThemes()

print(legoThemes.getThemeTitlesList())

此外,为确保完整性,themes.json的内容包括:

[
    {
        "_LegoTheme__title": "Title1",
        "_LegoTheme__description": "Description1",
        "_LegoTheme__thumbnailImage": "ThumbnailImage1",
        "_LegoTheme__logoImage": "LogoImage1",
        "_LegoTheme__url": "URL1"
    },
    {
        "_LegoTheme__title": "Title2",
        "_LegoTheme__description": "Description2",
        "_LegoTheme__thumbnailImage": "ThumbnailImage2",
        "_LegoTheme__logoImage": "LogoImage2",
        "_LegoTheme__url": "URL2"
    },
    {
        "_LegoTheme__title": "Title3",
        "_LegoTheme__description": "Description3",
        "_LegoTheme__thumbnailImage": "ThumbnailImage3",
        "_LegoTheme__logoImage": "LogoImage3",
        "_LegoTheme__url": "URL3"
    }
]

Tags: selfjsonurltitledefdescriptionthemethemes
2条回答

您可以将每个dict的值解压缩到LegoGame构造函数:

import json
...
with open(filename) as f:
    lst = json.load(f)

result = [LegoTheme(*obj.values()) for obj in lst]

鉴于:

d = {
    "_LegoTheme__title": "Title1",
    "_LegoTheme__description": "Description1",
    "_LegoTheme__thumbnailImage": "ThumbnailImage1",
    "_LegoTheme__logoImage": "LogoImage1",
    "_LegoTheme__url": "URL1"
}

我们可以编写一个通用转换函数:

def remove_prefix(prefix, d):
    return {k[len(prefix):] : v for k, v in d.items() if prefix in k}

声明一个数据类:

from dataclasses import dataclass

@dataclass
class LegoTheme:
     title: str
     description: str
     thumbnailImage: str
     logoImage: str
     url: str

并将其转换为具有以下特性的数据类:

lego_theme = LegoTheme(**remove_prefix("_LegoTheme__", d))

因此,您可以通过以下方式访问它:

lego_theme.title
lego_theme.description
lego_theme.thumbnailImage
lego_theme.logoImage
lego_theme.url

相关问题 更多 >

    热门问题