Java中使用ObjectMapper提取API字段构造合法请求的方法
解决Java中使用ObjectMapper提取API请求字段构造合法请求的问题
直接拼接序列化后的字符串会生成不合法的JSON格式(比如多个独立JSON值直接拼接),触发API格式校验失败。以下是两种更合理的解决方案:
方案一:定义专用DTO类(类型安全推荐)
创建一个与目标API请求结构匹配的DTO类,将原请求对象的目标字段赋值给DTO后整体序列化,确保JSON格式合法且类型安全。
// 目标请求结构对应的DTO类 public class TargetApiRequest { private String id; private List<Integer> instrumentLifecycleReasons; private List<Integer> associatedInstruments; // 构造器 public TargetApiRequest(String id, List<Integer> instrumentLifecycleReasons, List<Integer> associatedInstruments) { this.id = id; this.instrumentLifecycleReasons = instrumentLifecycleReasons; this.associatedInstruments = associatedInstruments; } // 省略getter/setter,或使用Lombok的@Data注解简化 } // 构造请求实体的代码逻辑 ObjectMapper obMapper = new ObjectMapper(); obMapper.registerModule(new JavaTimeModule()); AccessInstrument accessInstrument = searchCriteria.getAccessInstrument(); TargetApiRequest targetRequest = new TargetApiRequest( accessInstrument.getId(), accessInstrument.getInstrumentLifecycleReasons(), accessInstrument.getAssociatedInstruments() ); String validRequestJson = obMapper.writeValueAsString(targetRequest); Entity<String> requestEntity = Entity.entity(validRequestJson, MediaType.APPLICATION_JSON_TYPE);
方案二:使用ObjectNode动态构造JSON(灵活适配场景)
如果不需要额外创建DTO类,可以利用Jackson的ObjectNode动态组装所需字段,直接生成合法的JSON字符串。
ObjectMapper obMapper = new ObjectMapper(); obMapper.registerModule(new JavaTimeModule()); AccessInstrument accessInstrument = searchCriteria.getAccessInstrument(); // 创建空的ObjectNode,逐个添加目标字段 ObjectNode targetJsonNode = obMapper.createObjectNode(); targetJsonNode.put("id", accessInstrument.getId()); // 直接将列表转换为JsonNode并设置到ObjectNode中 targetJsonNode.set("instrument_lifecycle_reasons", obMapper.valueToTree(accessInstrument.getInstrumentLifecycleReasons())); targetJsonNode.set("associated_instruments", obMapper.valueToTree(accessInstrument.getAssociatedInstruments())); String validRequestJson = obMapper.writeValueAsString(targetJsonNode); Entity<String> requestEntity = Entity.entity(validRequestJson, MediaType.APPLICATION_JSON_TYPE);
这两种方式都能避免手动拼接字符串导致的格式问题,保证生成的JSON符合API校验要求。方案一适合结构固定的场景,类型安全性更高;方案二更灵活,适合需要动态调整字段的场景。
内容的提问来源于stack exchange,提问作者William Johnson
相关产品推荐
相关产品推荐

