You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 15:45:56