如何使用json模块将python对象转换为(json)嵌套dict,而不生成类似文件的对象?

如何使用json模块将python对象转换为(json)嵌套dict,而不生成类似文件的对象?,python,json,Python,Json,我有以下问题。我想将复杂对象转换为json字典。我无法直接这样做,因此我最终使用json.dumps()将对象首先生成一个字符串,然后使用json.loads()加载该字符串 我本来希望能够使用json.dump()实现这一点,但这需要我将它放入一个类似文件的对象中,当我想要获取dict数据结构时,它似乎是一个额外的环 有没有一种方法可以在不创建公开写方法的对象的情况下消除对字符串的转换和加载 示例代码: import json class Location(): def __init

我有以下问题。我想将复杂对象转换为json字典。我无法直接这样做,因此我最终使用json.dumps()将对象首先生成一个字符串,然后使用json.loads()加载该字符串

我本来希望能够使用json.dump()实现这一点,但这需要我将它放入一个类似文件的对象中,当我想要获取dict数据结构时,它似乎是一个额外的环

有没有一种方法可以在不创建公开写方法的对象的情况下消除对字符串的转换和加载

示例代码:

import json

class Location():
    def __init__(self, lat, lon):
         self.lat = lat
         self.lon = lon

class WeatherResponse():
     def __init__(self,
             state: str,
             temp: float,
             pressure: float,
             humidity: float,
             wind_speed: float,
             wind_direction: float,
             clouds: str,
             location: Location):
        self.state = state
        self.temp = temp
        self.pressure = pressure
        self.humidity = humidity
        self.wind_speed = wind_speed
        self.wind_direction = wind_direction
        self.clouds = clouds
        self.location = location

 weather = WeatherResponse(state = "Meteorite shower",
                      temp = 35.5,
                      pressure = 1,
                      humidity = "Wet",
                      wind_speed = 3,
                      wind_direction = 150,
                      clouds = "Cloudy",
                      location = Location(10, 10))

 weather_json = json.dump(weather) #Needs a file like object

 weather_string = json.dumps(weather, default = lambda o: o.__dict__)
 weather_dict = json.loads(weather_string)

 print(weather_dict)

因此,在明确了您的需求之后,您似乎希望将任意的
转换为嵌套的
dict
,而不是JSON字符串

在这种情况下,我建议您使用某种序列化程序/反序列化程序库,如或

pydantic
中的实现示例如下所示:

导入pydantic
类位置(pydantic.BaseModel):
lat:浮动
洛恩:浮子
类天气响应(pydantic.BaseModel):
国家:str
温度:浮子
压力:浮子
湿度:str
风速:浮动
风向:漂浮
云:str
地点:地点
天气=天气响应(
state=“陨石雨”,
温度=35.5,
压力=1,
湿度=“湿”,
风速=3,
风向=150,
云=“多云”,
位置=位置(纬度=10,经度=10),
)
weather\u dict=weather.dict()
#{'state':'陨石雨','temp':35.5,'压力':1.0,'湿度','风速':3.0,'风向':150.0,'云':'多云','location':{'lat':10.0,'lon':10.0}
有关高级用法,请查看提供的链接


希望有帮助

这回答了你的问题吗?你为什么不直接做天气呢?不,这个问题的答案使用了json.dumps方法,我在上面的示例代码中也举例说明了这个方法。
json.dumps
又有什么问题吗?@Szabolcs我想我把它弄得更混乱了,但你给了我更清晰的解释。我想将该对象转换为嵌套字典,并使用json模块来实现。我的问题是,我不想首先将对象转换为嵌套dict的字符串,然后通过加载将其转换为dict,而是直接将其转换为嵌套字典。dict方法不起作用,因为在这种情况下它不会展开位置对象。