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
相关产品推荐
相关产品推荐

