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

Apache Camel Quarkus获取Header中JSON对象sub字段报错求助

解决Apache Camel + Quarkus中解析动态JSON Header字段的问题

报错原因

你混用了org.json.simple和org.json两个完全独立的JSON库,JSONParser(来自json-simple)解析出的是org.json.simple.JSONObject,但你试图强制转换为org.json.JSONObject,两类属于不同类加载模块,导致类型转换异常。另外你把单个JSON对象转成JSONArray的操作完全多余,属于逻辑错误。

可行解决方案

因为x-token-info是动态JSON,无法用固定实体类映射,推荐以下两种方案:

方案1:使用Jackson JsonNode(Quarkus默认集成)

Quarkus自带Jackson依赖,无需额外引入,用JsonNode处理动态JSON非常灵活:

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

// 直接获取header为String类型,避免toString()的空指针风险
String tokenInfo = exchange.getIn().getHeader("x-token-info", String.class);

ObjectMapper mapper = new ObjectMapper();
try {
    JsonNode jsonNode = mapper.readTree(tokenInfo);
    // 检查sub字段存在且非空
    if (jsonNode.has("sub") && !jsonNode.get("sub").isNull()) {
        String subValue = jsonNode.get("sub").asText();
        // 此处添加你的业务逻辑
    } else {
        // 处理无sub字段的情况
    }
} catch (Exception e) {
    // 处理JSON格式错误或解析失败的场景
}

方案2:统一使用org.json库

如果偏好使用org.json,先确保引入Quarkus的JSON-P依赖(io.quarkus:quarkus-jsonp),然后代码如下:

import org.json.JSONObject;

String tokenInfo = exchange.getIn().getHeader("x-token-info", String.class);

try {
    JSONObject jsonObject = new JSONObject(tokenInfo);
    if (jsonObject.has("sub")) {
        String subValue = jsonObject.getString("sub");
        // 业务逻辑处理
    } else {
        // 无sub字段的处理逻辑
    }
} catch (Exception e) {
    // 解析异常处理
}

注意事项

  • 避免同时引入多个JSON库,防止类冲突
  • 获取header时直接指定类型String.class,比toString()更安全,避免空指针
  • 无需将单个JSON对象转为JSONArray,这是冗余操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 10:42:21