从S3读取JSON对象后提取type字段遇TypeError问题求助
解决S3读取JSON时多层转义导致的字段提取错误
问题场景
从S3读取JSON对象时使用如下代码:
json_object = s3_client.get_object(Bucket=bucket,Key=json_file_name) print(json_object) jsonFileReader = json_object['Body'].read() jsonDict = json.loads(jsonFileReader)
得到的原始数据为多层转义的字节串:
raw = b'"[{"timestamp": "2022-07-27T12:34:52.304000+00:00", "type": "ExecutionSucceeded", "id": 9, "previousEventId": 8, "executionSucceededEventDetails": {"output": "{\"statusCode\":200,\"body\":\"\\\"Hello from Lambda!\\\"\"}", "outputDetails": {"truncated": false}}}]"'
尝试提取type字段时执行以下代码:
raw = b'"[{"timestamp": "2022-07-27T12:34:52.304000+00:00", "type": "ExecutionSucceeded", "id": 9, "previousEventId": 8, "executionSucceededEventDetails": {"output": "{\"statusCode\":200,\"body\":\"\\\"Hello from Lambda!\\\"\"}", "outputDetails": {"truncated": false}}}]"' data = json.loads(raw.decode('utf-8')) print(data) print(data[0]) status=data[0]['type'] print(status)
触发错误:
TypeError: string indices must be integers
问题原因
原始数据是被双引号包裹的JSON数组字符串,第一次json.loads(raw.decode('utf-8'))解析后,得到的是字符串类型的数组内容(而非直接的列表对象)。此时data是字符串,data[0]取的是字符串的第一个字符([),自然无法通过['type']索引字典字段,因此报错。
解决方案
需要对数据进行两次JSON解析:
- 第一次解析:去除外层的双引号,得到内部的数组字符串。
- 第二次解析:将数组字符串转换为真正的Python列表对象,之后即可正常提取字段。
修正后完整代码
import json raw = b'"[{"timestamp": "2022-07-27T12:34:52.304000+00:00", "type": "ExecutionSucceeded", "id": 9, "previousEventId": 8, "executionSucceededEventDetails": {"output": "{\"statusCode\":200,\"body\":\"\\\"Hello from Lambda!\\\"\"}", "outputDetails": {"truncated": false}}}]"' # 第一次解析:去掉外层双引号,得到数组字符串 data_str = json.loads(raw.decode('utf-8')) # 第二次解析:将字符串转为列表对象 data = json.loads(data_str) # 提取type字段 status = data[0]['type'] print(status) # 输出:ExecutionSucceeded
内容的提问来源于stack exchange,提问作者Atharv Thakur
相关产品推荐
相关产品推荐

