如何通过JOLT将多格式第三方JSON转换为统一结构?
统一多格式JSON的JOLT转换方案
针对你提到的四种不同结构的JSON(status/reason/advertise字段可能是简单值或对象),可以通过JOLT的Shift+Modify+Default组合操作实现统一格式转换,以下是具体方案:
先明确源结构与目标结构
四种典型源JSON示例
- 所有字段为简单值
{ "status": "success", "reason": "ok", "advertise": "ad123" }
- status为对象,其余为简单值
{ "status": { "code": "success", "message": "done" }, "reason": "ok", "advertise": "ad123" }
- reason为对象,其余为简单值
{ "status": "success", "reason": { "code": "000", "desc": "ok" }, "advertise": "ad123" }
- 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": "" } } } ]
规则说明
- Shift操作:核心是兼容简单值与对象结构。通过
@(1,字段名)向上引用父级的简单值,将其映射到目标结构的对应字段;如果源字段是对象,则直接提取子字段。 - Modify操作:针对advertise的name字段做兜底,当源数据中没有name时,自动复用id的值(可根据需求调整)。
- 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
相关产品推荐
相关产品推荐

