运行时的部分 JSON 序列化(用于 RESTful 查询)

2022-09-04 23:34:29

我正在尝试在Tomcat中将Java对象转换为JSON(目前使用Jackson)。根据 RESTful 请求中的字段,我只想序列化这些字段。我想支持对字段的任何子集的请求,因此我想在运行时(动态)执行此操作。

例如,假设我想支持 User 对象的部分序列化:

class User {
    private final String id;
    private final String firstName;
    private final String lastName;

    public User(String id, String firstName, String lastName) {
        this.id = id;
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public String getId() { return id; }
    public String getFirstName() { return firstName; }
    public String getLastName() { return lastName; }
}

如果我提出以下要求:

GET /users/{id}/?fields=firstName,lastName

我想得到类似的东西。{"firstName":"Jack","lastName":"Johnson"}

如果我提出以下要求:

GET /users/{id}/?fields=firstName

我想得到类似的东西。{"firstName":"Jack"}

Jackson 的 JSON 视图能够定义逻辑属性的子集(通过 getter 或字段访问的内容)以进行序列化。但是,它们是静态定义的(使用批注),并且仅动态选择(每个序列化)。在实践中,我希望支持请求对象字段的任何子集,因此我可能拥有数千个JSON视图(10个字段意味着1,023个子集!

哪些 JSON 库支持运行时的部分序列化?


答案 1

我们使用Google GSON在Java对象和JSON之间来回转换。我不确定它是否具有您正在寻找的功能,但它非常易于使用,文档也很好。

如果你找不到一个可以满足你需求的库,我支持使用更宽松的结构化类(如HashMap)或自定义表示类作为代码和JSON之间的链接的建议。这将增加另一两层,但降低复杂性。祝你好运。


答案 2

我认为json-lib和flex-json支持更动态/灵活的过滤。

对于Jackson,一些用户所做的是使用HashMaps或JsonNodes作为更松散的结构,并从那里进行过滤。

此外,虽然这在短期内对您没有帮助,但Jackson 1.6对JsonNode(retainAll(String...名称),删除(字符串...names)和可能的 ObjectMapper,因为这是一个需要改进的已知领域。