将SeismicPortal WebSocket的JSON地震数据转为Python对象
嘿,手动写嵌套类处理SeismicPortal返回的复杂JSON确实挺折腾的!好在Python里有几个现成的工具能帮你自动完成JSON到Python对象的转换,不用自己一个个去定义嵌套结构。我给你推荐几个最实用的:
1. Pydantic(强烈推荐)
Pydantic现在是Python生态里处理数据序列化/反序列化的首选工具,不仅能自动把JSON转成Python对象,还自带类型验证和友好的类型提示,处理嵌套结构超省心。
首先安装依赖:
pip install pydantic
举个针对地震数据的例子:
from pydantic import BaseModel import json # 模拟从WebSocket收到的多行JSON字符串 seismic_json_str = '''{ "properties": { "mag": 4.5, "place": "10km NNE of Some Town", "time": 1620000000000 }, "geometry": { "type": "Point", "coordinates": [120.5, 30.2, 15] } }''' # 定义对应的数据模型,嵌套结构直接用类嵌套即可 class Geometry(BaseModel): type: str coordinates: list[float] class Properties(BaseModel): mag: float place: str time: int class SeismicData(BaseModel): properties: Properties geometry: Geometry # 直接把JSON字符串转成Python对象 seismic_obj = SeismicData.model_validate_json(seismic_json_str) # 像访问普通对象属性一样操作数据 print(f"地震震级: {seismic_obj.properties.mag}") print(f"震中坐标: {seismic_obj.geometry.coordinates}")
如果不想手动写模型类,你还可以用Pydantic的TypeAdapter快速转换(不过得到的是字典结构,要是需要强类型对象还是定义模型更清晰):
from pydantic import TypeAdapter # 快速转换JSON到Python字典(可像对象一样通过点语法访问) seismic_data = TypeAdapter(dict).validate_json(seismic_json_str) print(seismic_data["properties"]["mag"])
另外,如果你有现成的JSON样本,还可以用在线工具或者pydantic-cli直接把JSON转换成Pydantic模型代码,彻底省掉手动写类的麻烦。
2. dataclasses + dataclasses_json
如果你更倾向于用Python标准库的dataclasses,搭配dataclasses_json扩展库也能实现自动转换:
安装依赖:
pip install dataclasses-json
示例代码:
from dataclasses import dataclass from dataclasses_json import dataclass_json, Undefined import json seismic_json_str = '''{ "properties": { "mag": 4.5, "place": "10km NNE of Some Town", "time": 1620000000000 }, "geometry": { "type": "Point", "coordinates": [120.5, 30.2, 15] } }''' @dataclass_json(undefined=Undefined.EXCLUDE) @dataclass class Geometry: type: str coordinates: list[float] @dataclass_json(undefined=Undefined.EXCLUDE) @dataclass class Properties: mag: float place: str time: int @dataclass_json(undefined=Undefined.EXCLUDE) @dataclass class SeismicData: properties: Properties geometry: Geometry # 转换JSON字符串到Python对象 seismic_obj = SeismicData.from_json(seismic_json_str) print(seismic_obj.properties.place)
3. marshmallow(备选)
marshmallow是老牌的序列化库,也支持嵌套JSON的转换,不过相对前两个工具,语法会稍微繁琐一点:
安装依赖:
pip install marshmallow
示例:
from marshmallow import Schema, fields import json seismic_json_str = '''{ "properties": { "mag": 4.5, "place": "10km NNE of Some Town", "time": 1620000000000 }, "geometry": { "type": "Point", "coordinates": [120.5, 30.2, 15] } }''' class GeometrySchema(Schema): type = fields.Str() coordinates = fields.List(fields.Float()) class PropertiesSchema(Schema): mag = fields.Float() place = fields.Str() time = fields.Int() class SeismicDataSchema(Schema): properties = fields.Nested(PropertiesSchema) geometry = fields.Nested(GeometrySchema) # 解析JSON到字典(若要转成对象,可搭配marshmallow_dataclass扩展) schema = SeismicDataSchema() seismic_data = schema.load(json.loads(seismic_json_str)) print(seismic_data["properties"]["mag"])
总结
如果你追求简洁、强类型和自动验证,Pydantic绝对是最优选择;如果想基于标准库dataclasses,dataclasses_json是很好的补充;marshmallow则适合已经在使用它的项目。
内容的提问来源于stack exchange,提问作者fleetingbytes
相关产品推荐
相关产品推荐

