Python3 Преобразовать 'CaseInsensitiveDict' в JSON - PullRequest
2 голосов
/ 16 марта 2020

Я работаю над тем, что, как я предполагал, будет простой проблемой, но это действительно запутало. Я делаю запрос AD в Python с использованием модуля ldap3 . Этот запрос возвращает данные как генератор словарей python. Когда я запускаю команду type() для данных, это подтверждает, что это словарь.

Мне нужно преобразовать это в JSON, чтобы я мог записать его в файл журнала. Сначала я попытался json.dump(data, file), но когда я это сделал, я получил эту ошибку: TypeError: Object of type 'CaseInsensitiveDict' is not JSON serializable

Если я сначала попытался преобразовать словарь в строку, данные записались бы в кавычках, а внутренние поля остались с одиночным кавычки, так что это не так JSON - это выглядит так: "{'key': 'value'}"

Вот что у меня есть:

with open(outfile, 'w') as outfile:
    for entry in entry_generator: # Entry is equal to a dictionary of AD attributes
        json.dump(entry, outfile) # I have also tried json.dump(str(entry), outfile) etc

Я искал в сети, и я многое видно по этой проблеме с модулем requests, но ничего такого, что, похоже, не исправило бы мою ситуацию.

С модулем ldap3 есть метод entry_to_json(), который я использовал в других скриптах. Кажется, он не работает здесь из-за генератора, если кто-нибудь знает, как заставить его работать снова, это может решить мою проблему. Мысли?

1 Ответ

1 голос
/ 17 марта 2020

Попробуйте преобразовать CaseInsensitiveDict в простой старый dict, например, так:

json.dump(dict(data), file)

Это не будет работать, если есть вложенные CaseInsensitiveDict с. Вы должны будете рекурсивно преобразовать их в dict s изнутри.

...