Анализировать все значения байтового массива в JSON в Python

У меня есть сложный объект, который имеет некоторые свойства типа bytearray, и когда я пытаюсь преобразовать его в JSON, он выдает эту ошибку:

TypeError: Object of type bytearray is not JSON serializable.

Я могу сделать метод, жестко кодирующий свойства, которые, как я знаю, относятся к типу bytearray, а затем сделать следующее:

bytes(key.key_value).decode("utf-8")

Проблема в том, что у меня много возможных случаев, и я хотел бы создать общий метод, который позволяет мне анализировать все свойства bytearray JSON на string. Я пытался создать свою собственную реализацию json.JSONEncoder, но это не сработало. Любое предложение? Заранее спасибо!

В основном это просто не поддерживается в json. Как вы отличите байтовые массивы от строк при загрузке данных?

wim 07.09.2018 23:12

@wim Меня не волнует, так как я хочу показать только декодированное значение в консоли

Nahue 07.09.2018 23:26

ОК, значит, вам не нужно снова загружать json? Вы просто хотите, чтобы bytearray выглядел как строка на выходе?

wim 07.09.2018 23:28

@wim Да! Это именно то, что я хочу.

Nahue 07.09.2018 23:34
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
4
728
1

Ответы 1

Определитесь с поведением кодирования и обработки ошибок, которое вы хотите использовать для декодирования байтовых массивов в строки, а затем:

import json

class FunkyJSONEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, bytearray):
            return obj.decode("utf-8", errors = "replace")
        else:
            return super().default(obj)

Пример использования:

>>> dumps = FunkyJSONEncoder().encode
>>> dumps({'k': bytearray(b'potato')})
'{"k": "potato"}'

Это не сработало: TypeError: объект типа MyType не сериализуемый JSON. Однако я заставил это работать с другим решением, которое придумал. Спасибо, в любом случае!

Nahue 07.09.2018 23:57

Другие вопросы по теме