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

如何在复杂JSON对象中用f-string动态修改日期变量?求替代方案

动态修改复杂JSON对象中变量的解决方案

方法1:解析为Python字典修改(最推荐)

直接操作嵌套字符串极易出错,更稳妥的方式是先把JSON结构转为Python原生字典,修改目标字段后再重新序列化:

import json

# 定义原始结构,variables用字典而非字符串
payload_template = {
    "query": """query ($network: EthereumNetwork!, $dateFormat: String!, $from: ISO8601DateTime, $till: ISO8601DateTime) {
  ethereum(network: $network) {
    transactions(options: {asc: "date.date"}, date: {since: $from, till: $till}) {
      date: date {
        date(format: $dateFormat)
      }
      count: countBigInt
      gasValue
    }
  }
}""",
    "variables": {
        "limit": 10,
        "offset": 0,
        "network": "ethereum",
        "from": "2022-11-25T23:59:59",
        "till": "2022-11-28T23:59:59",
        "dateFormat": "%Y-%m-%d"
    }
}

# 动态替换日期变量
new_from_date = "2023-01-01T00:00:00"
payload_template["variables"]["from"] = new_from_date

# 最终序列化整个对象
payload = json.dumps(payload_template, indent=2)
print(payload)

这种方法完全避开字符串拼接的引号冲突问题,操作逻辑清晰,可读性和安全性拉满。

方法2:字符串模板替换(应急简单场景)

如果一定要用字符串替换方式,可以用占位符标记目标位置,再通过str.format()或f-string替换:

import json

# 将variables中的from值替换为占位符
variables_str = """{
  "limit": 10,
  "offset": 0,
  "network": "ethereum",
  "from": "{from_date}",
  "till": "2022-11-28T23:59:59",
  "dateFormat": "%Y-%m-%d"
}"""

new_from_date = "2023-01-01T00:00:00"
# 替换占位符得到更新后的variables字符串
updated_variables = variables_str.format(from_date=new_from_date)

# 构建并序列化最终payload
payload = json.dumps({
    "query": """query ($network: EthereumNetwork!, $dateFormat: String!, $from: ISO8601DateTime, $till: ISO8601DateTime) {
  ethereum(network: $network) {
    transactions(options: {asc: "date.date"}, date: {since: $from, till: $till}) {
      date: date {
        date(format: $dateFormat)
      }
      count: countBigInt
      gasValue
    }
  }
}""",
    "variables": updated_variables
}, indent=2)
print(payload)

注意:此方法仅适合简单场景,复杂嵌套结构下容易因引号、特殊字符出现格式错误。

方法3:Jinja2模板引擎(多变量动态生成)

如果需要同时修改多个字段,甚至动态调整query结构,可以用Jinja2模板引擎:

先安装依赖:pip install jinja2

from jinja2 import Template
import json

# 定义Jinja2模板,标记所有需要动态替换的变量
template_str = """
{
  "query": "query ($network: EthereumNetwork!, $dateFormat: String!, $from: ISO8601DateTime, $till: ISO8601DateTime) {
  ethereum(network: $network) {
    transactions(options: {asc: \"date.date\"}, date: {since: $from, till: $till}) {
      date: date {
        date(format: $dateFormat)
      }
      count: countBigInt
      gasValue
    }
  }
}",
  "variables": {
    "limit": 10,
    "offset": 0,
    "network": "{{ network }}",
    "from": "{{ from_date }}",
    "till": "{{ till_date }}",
    "dateFormat": "{{ date_format }}"
  }
}
"""

template = Template(template_str)
# 传入变量渲染模板
rendered = template.render(
    network="ethereum",
    from_date="2023-01-01T00:00:00",
    till_date="2023-01-03T23:59:59",
    date_format="%Y-%m-%d"
)
# 解析为JSON再序列化,确保格式正确
payload = json.dumps(json.loads(rendered), indent=2)
print(payload)

这种方式适合大量动态内容生成场景,模板语法灵活易维护。

内容的提问来源于stack exchange,提问作者Bemz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 03:35:24