有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我正在尝试在Tomcat中将Java对象转换为JSON(目前正在使用Jackson)。基于RESTful请求中的字段,我只想序列化这些字段。我希望支持对字段的任何子集的请求,所以我希望在运行时(动态地)这样做

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

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 View提供了定义逻辑属性子集(通过getter或字段访问的内容)以进行序列化的能力。但是,它们是静态定义的(使用注释),并且仅动态选择(每个序列化)。实际上,我希望支持请求对象字段的任何子集,因此我可能有数千个JSON视图(10个字段意味着1023个子集!)

哪个JSON库在运行时支持部分序列化


共 (2) 个答案

  1. # 1 楼答案

    从春季4.2.0开始。发布时,您可以完全控制要返回的字段,也可以使用以下链接中讨论的JSonfilter来执行此操作: 1.https://jira.spring.io/browse/SPR-12586 2.http://wiki.fasterxml.com/JacksonFeatureJsonFilter

    @RequestMapping(method = RequestMethod.POST, value = "/springjsonfilter")
        public @ResponseBody MappingJacksonValue byJsonFilter(...) {
            MappingJacksonValue jacksonValue = new MappingJacksonValue(responseObj);    
            jacksonValue.setFilters(customFilterObj);
            return jacksonValue;
        }
    
  2. # 2 楼答案

    我们使用Google GSON在Java对象和JSON之间来回转换。我不确定它是否有你想要的功能,但它很容易使用,文档也很好

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