как десериализовать JSON с ключами, которые не являются действительными Python именами в зефире - PullRequest
0 голосов
/ 13 января 2020

Я получаю объект JSON с ключом "sera:blah"

Как мне десериализовать этот объект в тип данных python, используя библиотеку зефира, поскольку это двоеточие является недопустимым именем свойства?

Редактировать:

Таким образом, классы в python не могут принимать двоеточие в имени свойства. Это неверный синтаксис.

Edit2:

В идеале я хотел бы иметь обходной путь в зефире.

Ответы [ 2 ]

1 голос
/ 14 января 2020

Я вижу 2 маршрута, которые вы можете использовать с этим

  • Попробуйте сначала десериализовать его с JSON.loads, итерировать каждое свойство и заменять все искаженные ключи перед подачей это к зефиру, или
  • Используйте класс JSON.JSONDecoder и сверните свою собственную функцию object_hook. Затем вызовите функцию .decode(), прежде чем кормить ее зефиром.

Я подробно остановился на последнем (что мне кажется более подходящим)

from json import loads, JSONDecoder
s = """{
  "obj1": 123,
  "list": [
    {"example2": 42},
    {"sera:blah": false},
    {"object:3": {"nest:ed": "obj"}}
  ]
}"""

data = loads(s)
print(data)

def obj_transform(obj):
  for key in obj.keys():  # Iterate through obj
    if ':' in key:
      obj[key.replace(':', '_')] = obj.pop(key)
  return obj

decoder = JSONDecoder(object_hook=obj_transform)
print(decoder.decode(s))

Результат печати:

{'obj1': 123, 'list': [{'example2': 42}, {'sera: blah': False}, {'object : 3 ': {' nest: ed ':' obj '}}]}
{' obj1 ': 123,' list ': [{' example2 ': 42}, {' sera_blah ': False}, { 'object_3': {'nest_ed': 'obj'}}]}

Это похоже на то, что вы ищете, чтобы обезопасить ваш ввод в зефир.

0 голосов
/ 14 января 2020

Зефир обрабатывает это с атрибутом data_key.

class MySchema(ma.Schema):
    sara_blah = ma.fields.String(data_key="sara_blah")

(Это синтаксис зефира 3. Зефир 2 используется load_from и dump_to.)

...