如何将Neo4j Python驱动查询结果转换为JSON格式
解决Neo4j Python驱动查询结果转JSON的序列化问题
问题原因
直接使用json.dumps(info, default=str)失败,是因为Neo4j返回的Record、Node对象,以及属性中的frozenset、neo4j.time.Date等类型都是JSON无法直接序列化的,仅用str()转换会得到非结构化的字符串,无法生成合法JSON。
解决方案:自定义序列化函数
针对Neo4j返回的特殊类型,编写递归处理的序列化函数,把每个不可序列化的类型转成JSON支持的格式:
import json import neo4j def serialize_neo4j(obj): # 处理Neo4j Node对象,转成包含id、标签、属性的字典 if isinstance(obj, neo4j.Node): return { "id": obj.id, "labels": list(obj.labels), # 将frozenset转为列表 "properties": serialize_neo4j(obj.properties) } # 处理Neo4j日期类型,转为ISO格式字符串 elif isinstance(obj, neo4j.time.Date): return obj.isoformat() # 处理frozenset,转为列表 elif isinstance(obj, frozenset): return list(obj) # 处理Neo4j Record对象,遍历键值对递归序列化 elif isinstance(obj, neo4j.Record): return {key: serialize_neo4j(value) for key, value in obj.items()} # 其他类型尝试默认序列化,失败则转为字符串 try: return json.JSONEncoder().default(obj) except TypeError: return str(obj) # 使用示例:假设result是Neo4j查询返回的Result对象 records = list(result) # 将结果流转为列表 json_data = json.dumps(records, default=serialize_neo4j, indent=2)
说明
- 对
Node对象:提取id、转为列表的labels、递归处理后的properties,保证结构清晰 - 对
neo4j.time.Date:用isoformat()转为标准日期字符串(如"2023-01-11"),比直接转字符串更规范 - 对
frozenset:转为普通列表,符合JSON数组格式 - 递归处理:确保嵌套在属性中的特殊类型也能被正确转换
内容的提问来源于stack exchange,提问作者Tono Kuriakose
相关产品推荐
相关产品推荐

