简体   繁体   English

Kafka 将值作为字符串发送:如何将其反序列化并将其转换为 JSON object 和 Python

[英]Kafka sends value as a string: How can I deserialize it and turn it into a JSON object with Python

I am trying to consume MSK (managed Amazon Kafka service) messages from a lambda function - MSK is the trigger of my lambda.我正在尝试使用来自 lambda function 的 MSK(托管 Amazon Kafka 服务)消息 - MSK 是我的 lambda 的触发器。

The producer looks like this:生产者看起来像这样:

data = {'time': 1611215510000000000, 'tags': {'tag1': 'tagvalue'}, 'fields': {'value': 12345}}
self.producer = KafkaProducer(
            security_protocol=self.security_protocol,
            bootstrap_servers=self.kafka_servers,
            value_serializer=lambda x: dumps(x).encode('utf-8'))
self.producer.send(kafka_topic, value=data)

In the lambda function, I receive the following:在 lambda function 中,我收到以下信息:

{
   "eventSource":"aws:kafka",
   "eventSourceArn":"<arn....>",
   "bootstrapServers":"<serverlist...>",
   "records":{
      "topic-0":[
         {
            "topic":"topic",
            "partition":0,
            "offset":0,
            "timestamp":1611138328871,
            "timestampType":"CREATE_TIME",
            "value":"eyJ0aW1lIjogMTYxMTEzODI4MDAwMDAwMDAwMCwgInRhZ3MiOiB7InN0YXR1cyI6ICJHb29kIn0sICJmaWVsZHMiOiB7InZhbHVlX251bSI6IDAuMCwgInZhbHVlIjogZmFsc2V9fQ=="
         },
         {
            "topic":"topic",
            "partition":0,
            "offset":1,
            "timestamp":1611138330033,
            "timestampType":"CREATE_TIME",
            "value":"eyJ0aW1lIjogMTYxMTEzODI4MDAwMDAwMDAwMCwgInRhZ3MiOiB7InN0YXR1cyI6ICJHb29kIn0sICJmaWVsZHMiOiB7InZhbHVlIjogMTQxMzUuMH19"
         }
    ]
  }
}

I'd like to transform the value strings to JSON objects.我想将值字符串转换为 JSON 对象。 How could I do it?我怎么能做到? I've tried a lot of versions, the one I thought should work throws an exception ( Exception: Expecting value: line 1 column 1 (char 0) )我尝试了很多版本,我认为应该工作的版本会引发异常( Exception: Expecting value: line 1 column 1 (char 0)

records = event['records']['topic-0']
for record in records:
    print(json.loads(record['value']).decode('utf-8'))

The value strings seem base64 encoded, so you need to find a way to decode them.值字符串似乎 base64 编码,所以你需要找到一种方法来解码它们。 Then you can load them.然后你可以加载它们。

The first string decoded using https://www.base64decode.org/ :使用https://www.base64decode.org/解码的第一个字符串:

{"time": 1611138280000000000, "tags": {"status": "Good"}, "fields": {"value_num": 0.0, "value": false}}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM