如何在Jackson中将TextNode类型的数组转换为ArrayNode
解决方案
核心逻辑:这类场景属于JSON嵌套序列化场景,即外层JSON的某字段值是另一段序列化后的JSON字符串,Jackson默认只会解析外层结构,将内层序列化字符串识别为TextNode,只需要对该TextNode的文本内容做二次解析即可。
注意:你给出的示例中
"[\"b\":12]"是非法JSON结构,JSON数组中不能直接存放键值对,合法的数组结构应为"[{\"b\":12}]",以下示例基于修正后的合法结构编写。
实现步骤
- 初始化Jackson的
ObjectMapper实例(全局复用即可,无需每次操作新建) - 解析原始JSON字符串得到根节点
- 取出目标TextNode字段的文本值
- 用
ObjectMapper二次解析该文本值得到对应类型的JsonNode,判断为数组类型后强转为ArrayNode即可
代码示例
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; public class JsonParseExample { // 全局复用ObjectMapper private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); public static void main(String[] args) throws Exception { // 原始JSON字符串,修正了a字段的非法数组结构 String rawJson = "{\"a\" : \"[{\\\"b\\\":12}]\"}"; // 第一次解析外层JSON JsonNode rootNode = OBJECT_MAPPER.readTree(rawJson); // 取出a字段的TextNode JsonNode rawANode = rootNode.get("a"); if (rawANode.isTextual()) { // 二次解析文本内容为JsonNode JsonNode parsedANode = OBJECT_MAPPER.readTree(rawANode.asText()); // 校验是否为数组类型,转为ArrayNode if (parsedANode.isArray()) { ArrayNode arrayNode = (ArrayNode) parsedANode; // 这里就可以对ArrayNode做任意操作了 System.out.println("转换后的ArrayNode内容:" + arrayNode); // 如果需要把转换后的节点替换回原根节点,可执行以下代码 ((ObjectNode) rootNode).set("a", arrayNode); System.out.println("替换后的完整JSON:" + OBJECT_MAPPER.writeValueAsString(rootNode)); } } } }
运行输出
转换后的ArrayNode内容:[{"b":12}] 替换后的完整JSON:{"a":[{"b":12}]}
内容的提问来源于stack exchange,提问作者blankRK
相关产品推荐
相关产品推荐

