在 spring boot 中,若需从深层嵌套的 json 中提取特定子结构(如 `book.author`)并反序列化为独立 java 类,应避免使用 `astext()` 导致空字符串错误,而应通过 `jsonnode.at()` 定位路径 + `objectmapper.treetovalue()` 安全转换。
在实际开发中,我们常遇到 API 返回的 JSON 结构层级较深,但业务逻辑仅关注其中某一层级(例如 book 或其子对象 author)。此时若强行用 jsonObject.get("book").get("author").asText() 获取字符串再反序列化,会因 asText() 对 null 或非标量节点返回空字符串(""),导致 Jackson 抛出 MismatchedInputException: No content to map due to end-of-input —— 这正是问题中的核心错误。
✅ 正确做法是:利用 Jackson 的树模型(Tree Model)精准定位 + 类型安全转换。关键步骤如下:
以下是完整可运行示例:
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data;
@Data
public class AuthorClass {
private String id;
private String firstName;
private S
tring lastName;
}
// 在 Service 或 Controller 中:
public class JsonParsingService {
private final ObjectMapper objectMapper = new ObjectMapper();
public AuthorClass extractAuthorFromJson(String jsonString) throws Exception {
// 1. 解析为 JsonNode 树
JsonNode rootNode = objectMapper.readTree(jsonString);
// 2. 使用 JSON Pointer 精准定位 "/book/author"(注意斜杠开头)
JsonNode authorNode = rootNode.at("/book/author");
// 3. 直接转换为 Java 对象 —— 安全、高效、类型明确
return objectMapper.treeToValue(authorNode, AuthorClass.class);
}
}⚠️ 注意事项:
通过此方式,你不仅能精准提取任意嵌套层级的对象,还能保持代码简洁、健壮且符合 Jackson 最佳实践。