如何使用Jackson的ObjectNode读取JSON字符串列表并转换为List<String>
错误根因
ObjectMapper.readValue() 仅支持将原始JSON输入(字符串、字节数组、输入流等)反序列化为Java对象,没有接收JsonNode作为第一个入参的重载,因此触发方法找不到的编译错误。
解决方案
提供两种常用实现:
方案1:替换为treeToValue方法
treeToValue是Jackson专门提供的、用于将已解析的JsonNode节点转换为目标Java对象的API,直接替换方法名即可:
List<String> sendBookIds = asStream(objectMapper.treeToValue(on.get("bookIds"), new TypeReference<List<String>>(){})) .map(JsonNode::asText) .flatMap(bookIds -> idResolver.fetchBookIds(bookIds).stream()) .distinct() .collect(Collectors.toList());
方案2:直接遍历ArrayNode(更推荐)
你拿到的on.get("bookIds")本身就是ArrayNode类型的JSON数组节点,不需要再做一次反序列化,直接遍历即可,性能更高且无需处理类型引用:
List<String> sendBookIds = asStream(on.get("bookIds")) .map(JsonNode::asText) .flatMap(bookId -> idResolver.fetchBookIds(bookId).stream()) .distinct() .collect(Collectors.toList());
可选优化:可以先添加
on.get("bookIds") != null && on.get("bookIds").isArray()的校验逻辑,避免字段不存在、类型不匹配时的空指针或类型转换异常。
内容的提问来源于stack exchange,提问作者user9347049
相关产品推荐
相关产品推荐

