Десериализация строки не совсем JSON в Python - PullRequest
1 голос
/ 04 апреля 2010

Я получаю следующий текст в виде строки из API REST на основе XML

'd':4 'ca':5 'sen':1 'diann':2,6,8 'feinstein':3,7,9

, что я хочу десериализовать в довольно маленький словарь Python:

{
    'd': [4],
    'ca': [5],
    'sen': [1],
    'diann': [2, 6, 8],
    'feinstein': [3, 7, 9]
}

Я надеюсь избежать использования регулярных выражений или манипулирования тяжелыми строками, так как этот формат не задокументирован и может измениться. Лучшее, что я смог придумать:

members = {}
for m in elem.text.split(' '):
    m = m.split(':')
    members[m[0].replace("'", '')] = map(int, m[1].split(','))
    return members

Очевидно, это ужасный подход, но он работает, и это лучше, чем все остальное, что у меня есть сейчас. Есть предложения по лучшим подходам?

Ответы [ 2 ]

2 голосов
/ 04 апреля 2010

Мне действительно нравится ответ ChristopheD, но в интересах изучения других возможностей есть:

eval("{" + s.replace(":", ":[").replace(" ", "], ") + "]}")

Это делает несколько простых замен для превращения строки в допустимый Python, затем использует eval, чтобы превратить ее в словарь.

Недостатки этого метода:

  1. eval опасно. Если ввод не является доверенным (и большинство не является), то ваша система может быть взломана.
  2. Это довольно кратко и, возможно, негибко, если формат изменяется таким образом, что не поддается преобразованию в Python.
2 голосов
/ 04 апреля 2010

Я бы переписал это следующим образом (единственное отличие - явное присвоение имен m[0] и m[1]):

members = {}
for m in elem.text.split(' '):
    key, value = m.split(':')
    members[key.replace("'", '')] = map(int, value.split(','))
    return members

В противном случае этот код выглядит довольно хорошо для меня. Это может быть написано немного короче, может быть (но это уменьшит его читабельность).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...