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

Apache Camel Exchange中JSON集合转换为Java对象返回Null的解决方法咨询

解决Apache Camel中JSON集合转Java对象的问题

看起来你在把Exchange里的JSON集合转成Java List时踩了两个主要坑:JSON格式本身有语法错误,以及类型转换的方式不对。咱们一步步来解决:


1. 先修复原始JSON的语法问题

你提供的JSON有多处语法错误,比如字段后缺失逗号、未闭合的括号、空值写法不规范,而且集合没有用[]包裹。修复后的正确JSON应该是这样:

[
  {
    "identifier": { "domain": "transport", "id": "123", "version": 1 },
    "record": "NEW",
    "payload": {
      "personalDetails": { "name": "bla bla bla", "dob": "" },
      "reason": ""
    }
  },
  {
    "identifier": { "domain": "transport", "id": "123", "version": 1 },
    "record": "NEW",
    "payload": {
      "personalDetails": { "name": "bla bla bla", "dob": "" },
      "reason": ""
    }
  }
]

注意:你原来的pesonalDetails拼写错误,应该是personalDetails,这会导致字段映射失败,一定要修正。


2. 修正Java对象转换的代码

你的代码里直接用RespModel.class去获取Body,但Exchange里是JSON数组,对应的Java类型是List<RespModel>,不能直接强转。在Apache Camel中,要获取泛型集合类型的Body,需要使用TypeReference来指定具体类型:

正确的转换代码

try {
    // 使用TypeReference明确指定List<RespModel>类型
    List<RespModel> records = exchange.getIn().getBody(new TypeReference<List<RespModel>>() {});
    if (records != null) {
        System.out.println("转换成功,集合大小:" + records.size());
    } else {
        System.out.println("转换后集合为空");
    }
} catch (Exception e) {
    System.out.println("转换失败:" + e.getLocalizedMessage());
    e.printStackTrace(); // 建议打印完整堆栈,方便排查
}

3. 确保RespModel类的结构与JSON字段匹配

你的RespModel类需要和JSON的层级结构对应,字段名称要一致(或者用@JsonProperty注解映射)。示例如下:

import com.fasterxml.jackson.annotation.JsonProperty;

public class RespModel {
    private Identifier identifier;
    private String record;
    private Payload payload;

    // 生成getter和setter方法
    public Identifier getIdentifier() { return identifier; }
    public void setIdentifier(Identifier identifier) { this.identifier = identifier; }

    public String getRecord() { return record; }
    public void setRecord(String record) { this.record = record; }

    public Payload getPayload() { return payload; }
    public void setPayload(Payload payload) { this.payload = payload; }

    // 内部类Identifier
    public static class Identifier {
        private String domain;
        private String id;
        private int version;

        // getter和setter
        public String getDomain() { return domain; }
        public void setDomain(String domain) { this.domain = domain; }

        public String getId() { return id; }
        public void setId(String id) { this.id = id; }

        public int getVersion() { return version; }
        public void setVersion(int version) { this.version = version; }
    }

    // 内部类Payload
    public static class Payload {
        // 注意这里的字段名要和JSON里的一致,修正拼写错误
        @JsonProperty("personalDetails")
        private PersonalDetails personalDetails;
        private String reason;

        // getter和setter
        public PersonalDetails getPersonalDetails() { return personalDetails; }
        public void setPersonalDetails(PersonalDetails personalDetails) { this.personalDetails = personalDetails; }

        public String getReason() { return reason; }
        public void setReason(String reason) { this.reason = reason; }
    }

    // 内部类PersonalDetails
    public static class PersonalDetails {
        private String name;
        private String dob;

        // getter和setter
        public String getName() { return name; }
        public void setName(String name) { this.name = name; }

        public String getDob() { return dob; }
        public void setDob(String dob) { this.dob = dob; }
    }
}

4. 额外注意事项

  • 确保你的Camel路由中已经配置了Jackson数据格式组件(比如jackson-databind依赖),Camel默认会用Jackson来处理JSON和Java对象的转换。
  • 如果JSON字段和Java字段名称不一致,一定要用@JsonProperty注解做映射,比如上面修正的personalDetails字段。

这样调整后,应该就能成功把JSON集合转换成List<RespModel>了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 20:02:40