【问题标题】:String message type throws TypeError: string indices must be integers字符串消息类型抛出 TypeError:字符串索引必须是整数
【发布时间】:2020-05-03 20:57:30
【问题描述】:

我有这个 Python 应用程序:

import json

class MessageHandler():

    def get_request_id(self, message):
        request_id = None
        message = json.dumps(message)
        print("MESSAGE %s" % message)
        if 'key' in message and 'payload' in message:
            request_id = message['key']['request_id']
        else:
            request_id = message['request_id']
        return request_id

    def get_message(self, message):
        message = json.dumps(message)
        print("MESSAGE %s" % message)
        if 'key' in message and 'payload' in message:
            message = message['payload']
        else:
            message = message
        return message


def main():

    message = "{'payload': {u'event_type': u'Object:Delete', u'format': u'2.0', u'bucket_uuid': u'a352600c-17f8-401b-ab49-7df0ca9fc4ea', u'system_uuid': u'bd607bc3-4f60-77c4-0180-9dd4115ec942', u'object_length': u'22', u'object_name': u'init_put_test0', u'bucket_name': u'container-acb77190-a4ee-47e3-a78b-8bc7cb894a0c', u'request_id': u'e25e9589-6520-437e-83e1-e0d12bd67c16', u'request_time': u'2020-01-16T23:11:36.105Z'}, 'key': {u'notification_id': u'7e13cb05-488a-47d0-a433-7bwwd33605b8', u'request_id': u'ddo34589-6120-412e-83a1-d12d2bd67c16'}}"

    message_handler = MessageHandler()

    request_id = message_handler.get_request_id(message)
    print("Request ID: %s" % request_id)

    request_id = message_handler.get_message(message)
    print("Message: %s" % request_id)


if __name__ == "__main__":
    main()

当我运行它时,我得到了这个:

Traceback (most recent call last):
  File "/Users/me/PycharmProjects/Helper/message_handler.py", line 92, in <module>
    main()
  File "/Users/me/PycharmProjects/Helper/message_handler.py", line 81, in main
    kafka_request_id = message_handler.get_request_id(kafka_message_2)
  File "/Users/me/PycharmProjects/Helper/message_handler.py", line 10, in get_request_id
    request_id = message['key']['request_id']
TypeError: string indices must be integers
MESSAGE "{'payload': {u'event_type': u'Object:Delete', u'format': u'2.0', u'bucket_uuid': u'a352600c-17f8-401b-ab49-7df0ca9fc4ea', u'system_uuid': u'bd607bc3-4f60-77c4-0180-9dd4115ec942', u'object_length': u'22', u'object_name': u'init_put_test0', u'bucket_name': u'container-acb77190-a4ee-47e3-a78b-8bc7cb894a0c', u'request_id': u'e25e9589-6520-437e-83e1-e0d12bd67c16', u'request_time': u'2020-01-16T23:11:36.105Z'}, 'key': {u'notification_id': u'7e13cb05-488a-47d0-a433-7bwwd33605b8', u'request_id': u'ddo34589-6120-412e-83a1-d12d2bd67c16'}}"

我怀疑我需要将message 转换为可以读取密钥的格式,但我该怎么做?

【问题讨论】:

  • message 字符串从何而来?顺便说一句,为什么不使用.format() 或 f-strings?

标签: python json typeerror


【解决方案1】:

json.dumps(message) 将 python 对象转换为 json 字符串。您想要做的是 json.loads(message),此方法将字符串转换为 python 对象。

【讨论】:

  • 我最初尝试过,但得到了这个:json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1) 我可能会做类似message.replace("\'", "\"") 和类似u 的事情,但有更好的方法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-28
  • 2021-04-28
  • 2020-06-24
  • 2016-03-26
  • 2017-09-07
  • 2018-08-19
相关资源
最近更新 更多