如何避免嵌入已有JSON字符串到JSON对象时的解析-转储往返?
避免JSON解析-转储往返操作的方法
你有一段合法的JSON字符串,想要将其嵌入到一个更大的JSON对象中,目前常规做法是先把字符串解析为字典,再重新序列化为JSON,但你希望跳过这种解析-转储的往返操作。
可行方案
直接字符串拼接(性能最优)
既然原json_str本身就是合法的JSON片段,你可以直接通过字符串拼接构造最终的JSON,完全跳过解析步骤:json_str = '{"name": "Alice", "age": 30}' # 外层大括号用双大括号转义,避免f-string语法冲突 new_json_str = f'{{"foo": "bar", "user": {json_str}}}'注意事项:
- 必须保证
json_str是完全合规的JSON,比如键名带双引号、特殊字符已正确转义,否则拼接后的结果会是无效JSON - f-string中需要用
{{和}}表示JSON里的普通大括号,避免被识别为f-string的占位符
- 必须保证
自定义JSON编码器(代码更规整,但未完全避免解析)
如果想保留json.dumps的调用方式,可以自定义编码器类,自动处理合法的JSON字符串:import json class RawJSONEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, str): try: # 验证字符串是否为合法JSON,若是则直接解析后序列化 return json.loads(obj) except ValueError: # 不是合法JSON则按普通字符串处理 pass return super().default(obj) json_str = '{"name": "Alice", "age": 30}' new_json_str = json.dumps({"foo": "bar", "user": json_str}, cls=RawJSONEncoder)这种方式本质上还是会解析原JSON字符串,只是把逻辑封装了起来,适合需要统一序列化逻辑的场景。
内容的提问来源于stack exchange,提问作者AlexNe
相关产品推荐
相关产品推荐

