如何在Python中实现符合Jolt Spec的JSON转换?
Python实现Jolt Shift转换的可行方案
1. 非官方Jolt Python实现:pyjolt
有社区维护的非官方Python库pyjolt,可以直接解析你的Jolt Spec并执行转换。
安装命令:
pip install pyjolt
使用示例:
import pyjolt # 你的Jolt转换规则 jolt_spec = [ { "operation": "shift", "spec": { "r_id": "r_id", "data": { "list": { "*": { "uid": "uid", "item_list": { "*": { "p_id": "p_id", "sku": "sku", "q": "q", "pr": "pr" } } } } } } } ] # 待转换的输入数据 input_data = { "r_id": "ORD-001", "data": { "list": [ { "uid": "USER-123", "item_list": [ {"p_id": "PROD-456", "sku": "ABC-789", "q": 3, "pr": 49.99}, {"p_id": "PROD-012", "sku": "XYZ-345", "q": 1, "pr": 29.99} ] } ] } } # 执行转换 output = pyjolt.transform(input_data, jolt_spec) print(output)
注意:该库为非官方实现,对复杂Jolt语法的支持可能有限,建议针对你的场景做测试验证。
2. 纯Python手动实现(最可控的Pythonic方式)
如果不想依赖第三方库,完全可以根据你的转换逻辑,用原生Python字典操作实现,灵活性更高:
def transform_order_data(input_data): result = {} # 复制顶级字段r_id if "r_id" in input_data: result["r_id"] = input_data["r_id"] # 提取用户ID和商品列表 if "data" in input_data and "list" in input_data["data"]: for order_item in input_data["data"]["list"]: # 提取uid if "uid" in order_item: result["uid"] = order_item["uid"] # 提取商品信息 if "item_list" in order_item: result["products"] = [] for prod in order_item["item_list"]: product_info = { "p_id": prod.get("p_id"), "sku": prod.get("sku"), "q": prod.get("q"), "pr": prod.get("pr") } result["products"].append(product_info) return result # 测试转换 input_data = { "r_id": "ORD-001", "data": { "list": [ { "uid": "USER-123", "item_list": [ {"p_id": "PROD-456", "sku": "ABC-789", "q": 3, "pr": 49.99}, {"p_id": "PROD-012", "sku": "XYZ-345", "q": 1, "pr": 29.99} ] } ] } } print(transform_order_data(input_data))
这种方式完全自定义,不需要学习额外语法,适合你的特定转换需求。
3. 用JSONPath工具实现
如果你的转换逻辑可以用JSONPath描述,也可以使用jsonpath-ng库提取字段并重组:
安装命令:
pip install jsonpath-ng
使用示例:
from jsonpath_ng import parse def transform_with_jsonpath(input_data): result = {} # 提取r_id r_id_match = parse('$.r_id').find(input_data) if r_id_match: result["r_id"] = r_id_match[0].value # 提取uid uid_match = parse('$.data.list[*].uid').find(input_data) if uid_match: result["uid"] = uid_match[0].value # 提取所有商品信息 product_matches = parse('$.data.list[*].item_list[*]').find(input_data) result["products"] = [match.value for match in product_matches] return result # 测试 print(transform_with_jsonpath(input_data))
内容的提问来源于stack exchange,提问作者bawa_91
相关产品推荐
相关产品推荐

