Создание объекта Python из строки Json
Соединение websocket с SeismicPortal отправляет мне данные о землетрясениях, упакованные в объект JSON, которые я получаю в виде многострочной строки, например:
{
"action": "create",
"data": {
"geometry": {
"coordinates": [
-95.12,
16.52,
-52.0
],
"type": "Point"
},
"id": "20180303_0000046",
"properties": {
"auth": "UNM",
"depth": 52.0,
"evtype": "ke",
"flynn_region": "OAXACA, MEXICO",
"lastupdate": "2018-03-03T10:26:00.0Z",
"lat": 16.52,
"lon": -95.12,
"mag": 4.0,
"magtype": "m",
"source_catalog": "EMSC-RTS",
"source_id": "652127",
"time": "2018-03-03T07:09:05.0Z",
"unid": "20180303_0000046"
},
"type": "Feature"
}
}
Я хочу, чтобы данные из строки были преобразованы в объект Python.
Как видно из данных JSON, здесь много вложений. Поскольку я определял классы и их встроенность для создания объекта on структуры, которая будет хранить все данные из JSON, я подумал, может быть, есть какая-то волшебная функция Python jsonStringToObject, которая бы адаптировала класс и все подклассы, необходимые для хранения всех данные в JSON и сделать его экземпляром.
Давайте получим необработанную строку JSON в переменной rawData:
rawData = """{"action":"create","data":{"geometry": {"type": "Point","coordinates": [... """
Прямо сейчас я должен сделать это:
>>> import json
>>> quake = json.loads(rawData)
>>> quake['data']['properties']['flynn_region']
"OXACA_MEXICO"
но синтаксис забит скобками и апострофами.
Я хотел бы просто получить доступ к данным, как это:
>>> import json
>>> quake = jsonStringToObject(rawData)
>>> quake.data.properties.flynn_region
"OXACA_MEXICO"
1 ответ
Вы можете создать свой собственный класс для этого. использование __getitem__
, а также __setitem__
обновить и получить значения из объекта __dict__
используя точечную запись:
import json
class PyJSON(object):
def __init__(self, d):
if type(d) is str:
d = json.loads(d)
self.convert_json(d)
def convert_json(self, d):
self.__dict__ = {}
for key, value in d.items():
if type(value) is dict:
value = PyJSON(value)
self.__dict__[key] = value
def __setitem__(self, key, value):
self.__dict__[key] = value
def __getitem__(self, key):
return self.__dict__[key]
rawData = """... raw data ..."""
quake = PyJSON(rawData)
Работает как положено:
>>> quake.data.properties.flynn_region
'OAXACA, MEXICO'