Создание объекта 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'
Другие вопросы по тегам