You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
}
问题分析与解决

可能的遗漏点

  1. 异常处理缺失:try块未搭配catch/finally,readValue方法会抛出IOException(如JSON格式错误、字段映射异常),未处理会导致编译失败。
  2. JSON转义字符未处理:从数据库获取的字符串可能包含HTML转义后的引号(示例中的&quot;),直接解析会触发JSON格式错误,需要先还原为普通引号。
  3. 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("&quot;", "\"");
    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("&quot;", "\"");
UserDTO userDto = gson.fromJson(jsonStr, UserDTO.class);

需提前在项目依赖中引入Gson(Maven/Gradle均可)。

方法2:数据库查询时直接处理转义

如果数据库存储的是HTML转义后的JSON,可在SQL查询阶段直接还原,以MySQL为例:

SELECT REPLACE(json_column, '&quot;', '"') FROM your_table WHERE ...

这样获取到的字符串可直接解析,无需在代码中额外处理。

方法3:借助Spring消息转换器(Spring环境)

若项目基于Spring,可利用MappingJackson2HttpMessageConverter完成解析:

MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
// 处理转义后解析
String jsonStr = tempString.get(i).replace("&quot;", "\"");
UserDTO userDto = converter.getObjectMapper().readValue(jsonStr, UserDTO.class);

内容的提问来源于stack exchange,提问作者David

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 08:20:27