Python конвертирует OrderedDict, сохраненный в виде строки, в фактический файл - PullRequest
1 голос
/ 10 мая 2019

У меня есть база данных Postgres, где OrderedDict было сохранено в виде строки. Мне нужно преобразовать эту строку в json / dict, чтобы ее можно было сохранить в JSONField. Как я могу преобразовать эту строку в dict?

Пример строки -

OrderedDict([('order_id', 'xxxxxx'), ('tracking_id', 'xxxxxx'), ('bank_ref_no', 'xxxxx'), ('order_status', 'Success')])

Я пытался json.loads(string), но выдает ошибку декодирования. Любое решение, кроме ручного анализа строки?

Ответы [ 3 ]

3 голосов
/ 10 мая 2019

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

import ast

a = "OrderedDict([('order_id', 'xxxxxx'), ('tracking_id', 'xxxxxx'), ('bank_ref_no', 'xxxxx'), ('order_status', 'Success')])"

# get the inner list representation
a = a.replace("OrderedDict(", '')
a = a[:-1]

# convert to a list of tuples
x = ast.literal_eval(a)

dict(x)
3 голосов
/ 10 мая 2019

Вы можете использовать eval для этой цели.

from collections import OrderedDict
import json

x = "OrderedDict([('order_id', 'xxxxxx'), ('tracking_id', 'xxxxxx'), ('bank_ref_no', 'xxxxx'), ('order_status', 'Success')])"

#run string through eval and convert to dict
dct = dict(eval(x))
print(dct)

Выход будет

{'order_id': 'xxxxxx', 'tracking_id': 'xxxxxx', 
'bank_ref_no': 'xxxxx', 'order_status': 'Success'}
0 голосов
/ 10 мая 2019

Другой подход - использовать Regex для извлечения списка, а затем использовать модуль ast.

Ex:

import re
import ast
from collections import OrderedDict

s = """OrderedDict([('order_id', 'xxxxxx'), ('tracking_id', 'xxxxxx'), ('bank_ref_no', 'xxxxx'), ('order_status', 'Success')])"""

print(OrderedDict(ast.literal_eval(re.search(r"(?<=OrderedDict\()(.*)\)$", s).group(1))))

Выход:

OrderedDict([('order_id', 'xxxxxx'), ('tracking_id', 'xxxxxx'), ('bank_ref_no', 'xxxxx'), ('order_status', 'Success')])
...