如何让Python处理后的JSON在Sphinx CodeBlock中保留换行?
问题:Sphinx CodeBlock中JSON格式化后无换行显示
我编写了如下Python函数处理请求中的JSON数据:
def funct(request): input = '' # Request body data = maybe_str(request.data()) if data: if is_json(request.headers.get('Content-Type', '')): input = json.dumps(data, indent=2, sort_keys=True, separators=(',', ': ')) else: input = data return input
该函数返回格式化后的字符串并放入Sphinx CodeBlock中,实际输出为无换行的紧凑JSON:
{ "items": [ { "item1": "/xyz", "item2": "/yzx", "item3": "/zxy" }, { "item1": "/xyz", "item2": "/yzx", "item3": "/zxy" } ] }
期望输出为带有正确换行和缩进的JSON:
{ "items": [ { "item1": "/xyz", "item2": "/yzx", "item3": "/zxy" }, { "item1": "/xyz", "item2": "/yzx", "item3": "/zxy" } ] }
我尝试使用.replace('\n',' ')方法,但问题仍未解决,请问该如何处理?
解决方案
1. 检查maybe_str函数的行为
如果request.data()返回的是已解析的JSON字典,maybe_str可能会把它转成紧凑的字符串形式,导致后续json.dumps对字符串做二次序列化,换行符被转义。修正逻辑,确保json.dumps接收的是字典而非字符串:
def funct(request): input = '' data = request.data() if data: if is_json(request.headers.get('Content-Type', '')): # 若data是字符串,先解析为字典 if isinstance(data, str): data = json.loads(data) input = json.dumps(data, indent=2, sort_keys=True, separators=(',', ': ')) else: input = maybe_str(data) return input
2. 确认Sphinx代码块的渲染逻辑
Sphinx的CodeBlock默认保留原始换行,但如果内容是动态插入的,要确保传递的字符串没有被额外转义(比如\n被转成\\n)。检查数据传递链路中是否有模板引擎或其他工具自动转义了特殊字符。
3. 用Raw块强制保留格式
如果Sphinx自动转义了换行符,可使用raw块包裹JSON内容,强制渲染原始格式:
.. raw:: html <pre><code>{ "items": [ { "item1": "/xyz", "item2": "/yzx", "item3": "/zxy" }, { "item1": "/xyz", "item2": "/yzx", "item3": "/zxy" } ] }</code></pre>
4. 移除无效的换行替换操作
.replace('\n',' ')属于多余操作,json.dumps生成的字符串已经包含正确的\n换行符,替换后反而可能破坏原有格式,直接删除该操作即可。
内容的提问来源于stack exchange,提问作者Thy ZacX
相关产品推荐
相关产品推荐

