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

如何通过JOLT将多格式第三方JSON转换为统一结构?

统一多格式JSON的JOLT转换方案

针对你提到的四种不同结构的JSON(status/reason/advertise字段可能是简单值或对象),可以通过JOLT的Shift+Modify+Default组合操作实现统一格式转换,以下是具体方案:

先明确源结构与目标结构

四种典型源JSON示例

  1. 所有字段为简单值
{
  "status": "success",
  "reason": "ok",
  "advertise": "ad123"
}
  1. status为对象,其余为简单值
{
  "status": { "code": "success", "message": "done" },
  "reason": "ok",
  "advertise": "ad123"
}
  1. reason为对象,其余为简单值
{
  "status": "success",
  "reason": { "code": "000", "desc": "ok" },
  "advertise": "ad123"
}
  1. advertise为对象,其余为简单值
{
  "status": "success",
  "reason": "ok",
  "advertise": { "id": "ad123", "name": "promo" }
}

目标统一结构

{
  "status": {
    "code": "xxx",
    "message": "xxx"
  },
  "reason": {
    "code": "xxx",
    "desc": "xxx"
  },
  "advertise": {
    "id": "xxx",
    "name": "xxx"
  }
}

JOLT转换规则(Spec)

创建jolt-spec.json文件,内容如下:

[
  {
    "operation": "shift",
    "spec": {
      // 处理status:对象取code/message,简单值同时赋值给code和message
      "status": {
        "code": "status.code",
        "message": "status.message",
        "@(1,status)": ["status.code", "status.message"]
      },
      // 处理reason:对象取code/desc,简单值同时赋值给code和desc
      "reason": {
        "code": "reason.code",
        "desc": "reason.desc",
        "@(1,reason)": ["reason.code", "reason.desc"]
      },
      // 处理advertise:对象取id/name,简单值赋值给id
      "advertise": {
        "id": "advertise.id",
        "name": "advertise.name",
        "@(1,advertise)": "advertise.id"
      }
    }
  },
  {
    "operation": "modify-override-beta",
    "spec": {
      // 若advertise.name为空,默认使用id的值
      "advertise": {
        "name": ["=notNull", "@(1,name)", "@(1,id)"]
      }
    }
  },
  {
    "operation": "default",
    "spec": {
      // 补全所有缺失字段,避免空结构
      "status": {
        "code": "",
        "message": ""
      },
      "reason": {
        "code": "",
        "desc": ""
      },
      "advertise": {
        "id": "",
        "name": ""
      }
    }
  }
]

规则说明

  1. Shift操作:核心是兼容简单值与对象结构。通过@(1,字段名)向上引用父级的简单值,将其映射到目标结构的对应字段;如果源字段是对象,则直接提取子字段。
  2. Modify操作:针对advertise的name字段做兜底,当源数据中没有name时,自动复用id的值(可根据需求调整)。
  3. Default操作:确保目标结构的所有字段都存在,即使源数据完全缺失对应字段,也会生成空字符串的默认值,避免后续处理出现空指针。

Java实现代码与依赖

Maven依赖

<dependency>
  <groupId>com.bazaarvoice.jolt</groupId>
  <artifactId>jolt-core</artifactId>
  <version>0.1.1</version>
</dependency>
<dependency>
  <groupId>com.bazaarvoice.jolt</groupId>
  <artifactId>json-utils</artifactId>
  <version>0.1.1</version>
</dependency>

Java示例代码

import com.bazaarvoice.jolt.Chainr;
import com.bazaarvoice.jolt.JsonUtils;
import java.util.List;
import java.util.Map;

public class JsonUnifier {
    public static void main(String[] args) {
        // 加载JOLT转换规则
        List<Object> joltSpec = JsonUtils.classpathToList("/jolt-spec.json");
        Chainr chainr = Chainr.fromSpec(joltSpec);

        // 替换为你的源JSON数据
        String sourceJson = "{\"status\":{\"code\":\"success\",\"message\":\"done\"},\"reason\":\"ok\",\"advertise\":\"ad123\"}";
        Object inputJson = JsonUtils.jsonToObject(sourceJson);

        // 执行转换
        Object unifiedJson = chainr.transform(inputJson);

        // 输出转换结果
        System.out.println(JsonUtils.toJsonString(unifiedJson));
    }
}

内容的提问来源于stack exchange,提问作者Anton Rusakou

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 07:20:20