如何在复杂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
相关产品推荐
相关产品推荐

