Java中如何将JSON字符串转换为DTO?
问题描述
我从数据库获取了字符串列表,代码如下:
List<String> tempString = myRepo.getData(str);
获取到的字符串示例为:
{"LastName": "Ben", "FirstName": "David", "EmailAddress": "david@gravatar.com"}
我希望将其转换为UserDTO,DTO定义如下:
@Data @NoArgsConstructor @AllArgsConstructor @Component public class UserDTO { @JsonProperty("FirstName") private String firstName; @JsonProperty("LastName") private String lastName; @JsonProperty("EmailAddress") private String email; }
我尝试使用以下代码转换但未成功,请问遗漏了什么,还有其他实现方法吗?
ObjectMapper mapper = new ObjectMapper(); UserDTO userdeto; try{ userdeto= mapper.readValue(tempString.get(i), UserDTO.class); }
问题分析与解决
可能的遗漏点
- 异常处理缺失:
try块未搭配catch/finally,readValue方法会抛出IOException(如JSON格式错误、字段映射异常),未处理会导致编译失败。 - JSON转义字符未处理:从数据库获取的字符串可能包含HTML转义后的引号(示例中的
"),直接解析会触发JSON格式错误,需要先还原为普通引号。 - ObjectMapper配置不足:默认配置下,若JSON存在DTO未定义的字段,会直接解析失败,需手动关闭该校验规则。
修正后的代码示例
ObjectMapper mapper = new ObjectMapper(); // 忽略JSON中存在但DTO未定义的字段,避免解析失败 mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); UserDTO userDto; try { // 先还原转义的引号 String jsonStr = tempString.get(i).replace(""", "\""); userDto = mapper.readValue(jsonStr, UserDTO.class); } catch (IOException e) { // 按需处理异常,比如打印日志或抛出业务异常 e.printStackTrace(); }
其他实现方法
方法1:使用Gson库
若不想用Jackson,可改用Gson解析:
Gson gson = new Gson(); // 先处理转义字符 String jsonStr = tempString.get(i).replace(""", "\""); UserDTO userDto = gson.fromJson(jsonStr, UserDTO.class);
需提前在项目依赖中引入Gson(Maven/Gradle均可)。
方法2:数据库查询时直接处理转义
如果数据库存储的是HTML转义后的JSON,可在SQL查询阶段直接还原,以MySQL为例:
SELECT REPLACE(json_column, '"', '"') FROM your_table WHERE ...
这样获取到的字符串可直接解析,无需在代码中额外处理。
方法3:借助Spring消息转换器(Spring环境)
若项目基于Spring,可利用MappingJackson2HttpMessageConverter完成解析:
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); // 处理转义后解析 String jsonStr = tempString.get(i).replace(""", "\""); UserDTO userDto = converter.getObjectMapper().readValue(jsonStr, UserDTO.class);
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

