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

Airflow中K8sPodOperator传递XCOM JSON双引号丢失致JSONDecodeError求助

解决Airflow KubernetesPodOperator传递JSON时双引号丢失的问题

问题根源

当你将XCOM中的JSON字符串作为命令行参数传递给KubernetesPodOperator时,K8s的shell会解析参数中的双引号,将原本的{"agents": ["john.doe@example.com"]}解析为{agents: [john.doe@example.com]},丢失了JSON格式必需的双引号,最终导致json.loads解析失败。

解决方案

方案1:使用Jinja的tojson过滤器转义

修改XCOM数据的Jinja表达式,通过tojson过滤器将JSON字符串转义为适合命令行传递的格式:

XCOM_DATA = '{{ task_instance.xcom_pull(task_ids="task_name", key="return_value")["data"] | tojson }}'

tojson会自动将内部的双引号转义为\",确保shell解析时不会破坏JSON结构。

方案2:通过环境变量传递JSON(推荐)

避免命令行参数的shell解析问题,直接将JSON字符串注入到Pod的环境变量中:

KubernetesPodOperator(
    cmds=["python", "src/send_notification.py"],
    env_vars={
        "DATA_JSON": '{{ task_instance.xcom_pull(task_ids="task_name", key="return_value")["data"] }}'
    },
    task_id="notify",
    name="notify",
    dag=dag,
    **COMMON_TASKS_ARGS,
)

在脚本中通过环境变量读取并解析:

import os
import json

# 从环境变量读取JSON字符串并解析
data = json.loads(os.environ.get("DATA_JSON", "{}"))

方案3:手动转义双引号

使用Jinja的replace过滤器手动将双引号替换为转义后的\":

XCOM_DATA = '{{ task_instance.xcom_pull(task_ids="task_name", key="return_value")["data"] | replace('"', '\\"') }}'

方案4:使用Jinja的quote过滤器

quote过滤器会将字符串处理为符合shell参数规范的格式,自动处理引号转义:

XCOM_DATA = '{{ task_instance.xcom_pull(task_ids="task_name", key="return_value")["data"] | quote }}'

验证

修改后,检查传递给K8s的命令,确保JSON字符串的双引号被正确保留(例如显示为"{\"agents\": [\"john.doe@example.com\"]}"),此时脚本中的json.loads即可正常解析。

内容的提问来源于stack exchange,提问作者Alexander Montoya Ángel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 13:17:48