如何把列表格式的createddate转为单个值,实现跨源日期值比较?
问题:统一CreatedDate格式以便比较
你需要对比两个来源的createddate值,但其中一个通过过滤器提取后始终返回列表格式,无法和另一个字符串格式的值直接匹配。
原始对象结构:
{ "changed": false, "failed": false, "object_info": [ { "object_data": { "accept_ranges": "bytes", "content_length": 2760249, "content_type": "binary/octet-stream", "e_tag": "\"0b82b2320d1d8ac226cd2720ccad554c\"", "last_modified": "2023-05-15T16:32:27+00:00", "metadata": { "createddate": "2022-11-30T21:29:25.066Z" }, "server_side_encryption": "AES256", "version_id": "SRehoPRyDbp.Rn2GKYXRE_40FzyLg4ek" } } ] }
你当前使用的过滤器:
item_info.object_info | map(attribute='object_data.metadata.createddate')
返回结果(列表格式):
{ "msg": [ "2022-11-30T21:29:25.066Z" ] }
需要匹配的目标格式(字符串):
{ "msg": "2022-11-30T21:29:25.066Z" }
解决方案
方法1:直接通过索引提取(最直接)
因为object_info是仅包含单个元素的列表,你可以跳过map,直接用索引[0]定位元素后逐层取值:
item_info.object_info[0].object_data.metadata.createddate
这样会直接返回单个字符串值,和目标格式完全匹配。
方法2:用first过滤器提取列表首个元素
如果保留map的写法,只需在过滤器末尾添加| first,就能从单元素列表中提取出唯一的字符串值:
item_info.object_info | map(attribute='object_data.metadata.createddate') | first
方法3:兼容空列表场景(可选)
如果object_info可能为空列表,为避免报错,可以结合default处理默认值:
(item_info.object_info | map(attribute='object_data.metadata.createddate') | first) | default('')
为什么flatten没效果?
因为map返回的是单元素列表,flatten仅对嵌套列表生效(比如[[1]]会被展平为[1]),但对[1]这种单层单元素列表没有作用,而first才是提取列表首个元素的正确方式。
内容的提问来源于stack exchange,提问作者jerdub1993
相关产品推荐
相关产品推荐

