如何在python中将telethon对象转换为有效的JSON

时间:2017-09-05 10:03:55

标签: python json telethon

我使用telethon包,用于连接和从电报中获取数据。 我想将Message对象转换为有效的JSON。 例如,我从telethon中的一个API获取此对象:

{
Message: {
    via_bot_id: None,
    entities: [],
    out: None,
    post: True,
    from_id: None,
    message: "hi everybody",
    id: 71,
    media_unread: None,
    reply_markup: None,
    fwd_from: {
        channel_id: 1119999790,
        channel_post: 2,
        date: 2017 - 09 - 04 15: 43: 48,
        from_id: None
    },
    reply_to_msg_id: None,
    edit_date: None,
    to_id: {
        channel_id: 1099583379
    },
    views: 2,
    mentioned: None,
    date: 2017 - 09 - 05 09: 28: 46,
    media: None,
    silent: None
} }

这是我最喜欢的结果:

{
"Message": {
    "via_bot_id": "None",
    "entities": [],
    "out": "None",
    "post": "True",
    "from_id": "None",
    "message": "hi everybody",
    "id": 71,
    "media_unread": "None",
    "reply_markup": "None",
    "fwd_from": {
        "channel_id": 1119999790,
        "channel_post": 2,
        "date": "2017 - 09 - 04 15: 43: 48",
        "from_id": "None"
    },
    "reply_to_msg_id": "None",
    "edit_date": "None",
    "to_id": {
        "channel_id": 1099583379
    },
    "views": 2,
    "mentioned": "None",
    "date": "2017 - 09 - 05 09: 28: 46",
    "media": "None",
    "silent": "None"
}}

有没有办法在Python中进行转换?

2 个答案:

答案 0 :(得分:1)

例如,您可以将每个对象递归地转换为 dict:

def has_to_dict(obj):
   method = getattr(obj, "to_dict", None)

   return callable(method)

def to_dict_req(obj):
res = {}
if has_to_dict(obj):
    for key, value in obj.to_dict().items():
        if has_to_dict(value):
            value = to_dict_req(value)
        else:
            value = str(value)
        res[key] = value
    return res
else:
    return str(obj)

答案 1 :(得分:0)

我用这种方式解决了我的问题

我希望它对你也有用

例如,我得到channel个对象并将其转换为JSON。

index.py

import json

from telethon import TelegramClient
from telethon.tl.functions.channels import GetFullChannelRequest
from telethon.tl.types import ChannelParticipantsSearch

from helpers import date_format

api_id = XXXXX
api_hash = 'XXXXXXXXXXXXXXXXXXXXXX'
phone_number = '+98XXXXXXXXXXX'
################################################
channel_username = 'tehrandb'
################################################

client = TelegramClient('session_name',
                    api_id,
                    api_hash)

assert client.connect()
if not client.is_user_authorized():
client.send_code_request(phone_number)
me = client.sign_in(phone_number, input('Enter code: '))

# ---------------------------------------
my_filter = ChannelParticipantsSearch('')
all_participants = []
while_condition = True
# ---------------------------------------
channel = client(GetFullChannelRequest(channel_username))
channel_dict = channel.to_dict()
json = json.dumps(channel_dict,default=date_format)

helpers.py

import datetime


def date_format(message):
    """
    :param message:
    :return:
    """
    if type(message) is datetime:
        return message.strftime("%Y-%m-%d %H:%M:%S")