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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 18:07:35