使用Jackson反序列化嵌套JSON字符串,无需自定义反序列化器的方法?
解决方案:无需自定义完整反序列化器的简便处理方式
针对你遇到的JSON嵌套字符串反序列化问题,除了自定义全局反序列化器,还有两种更轻量化的处理方法:
方法一:在字段setter中手动解析
直接在MyObject的setResults方法里,把传入的字符串解析为Set<CustomObject>,无需额外编写复杂的反序列化器:
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.util.Set; public class MyObject { int portalId; int userId; Set<CustomObject> results; // portalId、userId的getter/setter public void setResults(String resultsJson) throws IOException { ObjectMapper mapper = new ObjectMapper(); this.results = mapper.readValue(resultsJson, new TypeReference<Set<CustomObject>>() {}); } // results的getter public Set<CustomObject> getResults() { return results; } }
注:这里的IOException可根据业务需求选择捕获处理或向上抛出。
方法二:使用@JsonDeserialize绑定简易转换器
定义一个小型转换器类专门处理字符串到目标集合的转换,再通过注解绑定到字段上,比全局反序列化器更聚焦:
1. 实现转换器类
import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.type.TypeFactory; import com.fasterxml.jackson.databind.util.StdConverter; import java.util.Set; public class StringToCustomObjectSetConverter extends StdConverter<String, Set<CustomObject>> { @Override public Set<CustomObject> convert(String value) { try { ObjectMapper mapper = new ObjectMapper(); JavaType targetType = TypeFactory.defaultInstance() .constructCollectionType(Set.class, CustomObject.class); return mapper.readValue(value, targetType); } catch (Exception e) { throw new RuntimeException("解析results字段失败", e); } } }
2. 在实体类字段上添加注解
import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import java.util.Set; public class MyObject { int portalId; int userId; @JsonDeserialize(converter = StringToCustomObjectSetConverter.class) Set<CustomObject> results; // 所有字段的getter/setter }
额外提示:处理数字字符串转int的问题
你的JSON中portalId和userId是字符串类型,但Java类定义为int,Jackson默认会自动完成这种类型转换。如果遇到特殊场景转换失败,可在对应字段上添加@JsonFormat(shape = JsonFormat.Shape.NUMBER_INT)辅助转换,或在setter中手动处理。
内容的提问来源于stack exchange,提问作者Maxwell Newberry
相关产品推荐
相关产品推荐

