You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:10:24