Jsonb.fromJson无法反序列化Jsonb.toJson生成的Set集合问题
JSON-B反序列化Set集合为空的问题
我有一个同时适配JAXB、JSON-B和JPA的实体类Review,序列化含Set<Directory>的对象时JSON-B工作正常,但反序列化相同的JSON字符串时,Set集合始终为空。
我先基于JAXB实现了功能,用Directory类封装Path类型,并通过XmlJavaTypeAdapter完成Path的适配。问题仅出现在反序列化环节,我尝试自定义JsonbDeserializer<Set<Directory>>并通过JsonbConfig配置,但该反序列化器从未被调用。
我的需求是在REST接口中复用同一对象,同时支持XML、JSON的序列化/反序列化,以及JPA持久化,实际实现遇到了超出预期的困难。
REST接口示例:
@POST @Consumes({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON}) @Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON}) public Response persistReview(Review review) { ... }
Maven依赖
<dependency> <groupId>jakarta.json.bind</groupId> <artifactId>jakarta.json.bind-api</artifactId> <version>3.0.1</version> </dependency> <dependency> <groupId>org.eclipse</groupId> <artifactId>yasson</artifactId> <version>3.0.2</version> </dependency>
Directory类(Set集合元素)
@XmlAccessorType(XmlAccessType.FIELD) public class Directory { @XmlElement @XmlJavaTypeAdapter(ArtifactDirectoryTranslator.class) private Path path; public Directory() {} public Directory(Path path) { this.path = path; } public Path getPath() { return path; } public void setPath(Path path) { this.path = path; } }
JAXB/JSONB/JPA实体类Review
@XmlRootElement(name = "review") @XmlAccessorType(XmlAccessType.FIELD) public class Review { @XmlElementWrapper(name = "artifact-directories") private final Set<Directory> directories = new HashSet<>(); public Review addDirectory(Path dirPath) { directories.add(new Directory(dirPath)); return this; } public Set<Directory> getDirectories() { return directories; } public void setDirectories(Set<Directory> directories) { // 为适配JPA/Hibernate如此实现 this.directories.clear(); this.directories.addAll(directories); } }
单元测试代码
@Test public void testJsonb() { Review uut_review = new Review(); uut_review.addDirectory(Path.of("/some/path/1")); uut_review.addDirectory(Path.of("/some/path/2")); JsonbConfig config = new JsonbConfig().withFormatting(true); Jsonb jsonb = JsonbBuilder.newBuilder().withConfig(config).build(); // 序列化正常:{"directories":[{"path": "/some/path/1"}, {"path": "/some/path/2"}]} String jsonResult = jsonb.toJson(uut_review); System.out.println(jsonResult); // 反序列化异常:{"directories":[]} Review actualReview = jsonb.fromJson(jsonResult, Review.class); String jsonResult2 = jsonb.toJson(actualReview); System.out.println(jsonResult2); }
单元测试输出
{ "directories": [ { "path": "/some/path/1" }, { "path": "/some/path/2" } ] } { "directories": [ ] }
内容的提问来源于stack exchange,提问作者voidnull
相关产品推荐
相关产品推荐

