You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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解析:

  1. 第一次解析:去除外层的双引号,得到内部的数组字符串。
  2. 第二次解析:将数组字符串转换为真正的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 05:45:36