Spring Boot解析嵌套JSON为独立对象时遇MismatchedInputException错误
问题:Jackson解析嵌套JSON对象时出现MismatchedInputException错误
我有一段包含嵌套对象的JSON数据:
{ "process": "create", "processDescription": "some description", "book": { "id": "some unique id", "bookName": "some name", "bookISBN": "some number", "bookDesc": "some description", "author": { "id": "a different ID", "firstName": "some name", "lastName": "some description" }, "timestampUpdated": null, "timestampCreated": 1672753599223, "createdByUser": "Jane Doe", "updatedByUser": null }, "someField": "some data", "anotherField": "more data" }
我仅关注其中的book对象和author对象,且已为它们定义了对应的Java类。尝试通过以下代码读取JSON字符串时出现错误:
JsonNode jsonObject = new ObjectMapper().readTree(jsonString); JsonNode bookObj = jsonObject.get("book"); JsonNode authorObj = bookObj.get("author"); ObjectMapper objectMapper = new ObjectMapper(); AuthorClass author = objectMapper.readValue(authorObj.asText(), AuthorClass.class);
错误信息:
com.fasterxml.jackson.databind.exc.MismatchedInputException: No content to map due to end-of-input at [Source: (String)""; line: 1, column: 0]
问题原因
调用authorObj.asText()会尝试将author这个JSON对象转换为字符串,但Jackson对非字符串类型的JsonNode调用asText()会返回空字符串,后续readValue解析空字符串时自然会报“无内容可映射”的错误。
解决方法
以下几种方式可以正确解析嵌套的author对象:
方法1:直接从JsonNode转换为Java对象
使用treeToValue方法直接将JsonNode转换为目标类实例,无需转成字符串:
ObjectMapper objectMapper = new ObjectMapper(); JsonNode jsonObject = objectMapper.readTree(jsonString); // 直接定位到author节点 JsonNode authorNode = jsonObject.get("book").get("author"); // 转换为AuthorClass对象 AuthorClass author = objectMapper.treeToValue(authorNode, AuthorClass.class);
方法2:先解析Book对象再取Author
如果已经定义了包含AuthorClass字段的BookClass,可以先解析整个book节点,再从中获取author:
ObjectMapper objectMapper = new ObjectMapper(); JsonNode jsonObject = objectMapper.readTree(jsonString); // 解析book节点为BookClass实例 BookClass book = objectMapper.treeToValue(jsonObject.get("book"), BookClass.class); // 从book对象中获取author AuthorClass author = book.getAuthor();
方法3:使用JsonParser解析
通过JsonNode.traverse()获取JsonParser,再传入readValue方法:
ObjectMapper objectMapper = new ObjectMapper(); JsonNode jsonObject = objectMapper.readTree(jsonString); JsonNode authorNode = jsonObject.get("book").get("author"); // 用traverse()获取解析器,再转换对象 AuthorClass author = objectMapper.readValue(authorNode.traverse(), AuthorClass.class);
内容的提问来源于stack exchange,提问作者jason
相关产品推荐
相关产品推荐

