Как древовидно Python диктует? - PullRequest
0 голосов
/ 05 февраля 2019

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

{
  "message_id": 445793,
  "from": {
   "id": 106596774,
   "is_bot": false,
   "first_name": "Komron",
   "last_name": "Aripov",
   "username": "tgcode",
   "language_code": "en"
  },
  "chat": {
   "id": 106596774,
   "first_name": "Komron",
   "last_name": "Aripov",
   "username": "tgcode",
   "type": "private"
  },
  "date": 1549380586,
  "text": "ayye"
}

в маленькое аккуратное дерево, такое как это:

Message
 ├ message_id: 445793
 ├ from
 ┊  ├ id: 106596774
 ┊  ├ is_bot: false
 ┊  ├ first_name: Komron
 ┊  ├ last_name: Aripov
 ┊  ├ username: tgcode
 ┊  └ language_code: en
 ├ chat
 ┊  ├ id: 106596774
 ┊  ├ first_name: Komron
 ┊  ├ last_name: Aripov
 ┊  ├ username: tgcode
 ┊  └ type: private
 ├ date: 1549290736
 └ text: ayye

Я пытался использовать библиотеку treelib для python, но для их класса не предлагается метод преобразования json в необходимый форматированный текст.Это также кажется слишком сложным для моего варианта использования.

Есть библиотека для моего варианта использования на github , но она в javascript (не могу понять это для обратного инжиниринга)

1 Ответ

0 голосов
/ 05 февраля 2019

Это казалось забавным, поэтому я попробовал:

def custom_display(input, depth = 0):
    if depth == 0:
        output_string = "Message\n"
    else:
        output_string = ""
    if type(input) is dict:
        final_index = len(input)-1
        current_index = 0
        for key, value in input.items():
            for indent in range(0, depth):
                output_string += "  ┊ "
            if current_index == final_index:
                output_string += "  └ "
            else:
                output_string += "  ├ "
                current_index += 1
            if type(value) is dict:
                output_string += key + '\n' + custom_display(value, depth + 1)
            else:
                output_string += key + ": " + custom_display(value, depth+1) + '\n'
    else:
        output_string = str(input)

    return output_string

Использование,

dict_input = {
  "message_id": 445793,
  "from": {
   "id": 106596774,
   "is_bot": False,
   "first_name": "Komron",
   "last_name": "Aripov",
   "username": "tgcode",
   "language_code": "en"
  },
  "chat": {
   "id": 106596774,
   "first_name": "Komron",
   "last_name": "Aripov",
   "username": "tgcode",
   "type": "private"
  },
  "date": 1549380586,
  "text": "ayye"
}

print(custom_display(dict_input))

Дает вывод:

Message
  ├ message_id: 445793
  ├ from
  ┊   ├ id: 106596774
  ┊   ├ is_bot: False
  ┊   ├ first_name: Komron
  ┊   ├ last_name: Aripov
  ┊   ├ username: tgcode
  ┊   └ language_code: en
  ├ chat
  ┊   ├ id: 106596774
  ┊   ├ first_name: Komron
  ┊   ├ last_name: Aripov
  ┊   ├ username: tgcode
  ┊   └ type: private
  ├ date: 1549380586
  └ text: ayye
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...