最小化要为Spring Web服务呈现JSON数据而序列化的数据

时间:2014-03-18 14:40:34

标签: java json spring serialization struts2

到目前为止,我一直在使用STRUTS作为MVC框架。
struts允许的最佳功能之一是: 可以将逗号分隔的正则表达式列表传递给JSON结果,以限制将序列化哪些属性。只有匹配任何这些正则表达式的属性才会包含在序列化输出中。

例如:

<action name="GetAllGroups" class="com.example.action.GroupAction"          method="getAllGroups">
            <result type="json">
                <param name="includeProperties">
                    ^groups\[\d+\]\.id, ^groups\[\d+\]\.name, ^groups\[\d+\]\.parent\.id
                </param>
            </result>
</action>

这将仅序列化组列表中所需的参数,从而减少有效负载或冗余数据(例如:组的其他属性,如创建时间,更新时间,成员等)

现在我们正在使用SPRING MVC,因为我们正在迁移到Web服务并将JSON呈现为所有请求的数据类型。 使用以下配置:

<bean
        class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <list>
                <ref bean="jsonConverter" />
            </list>
        </property>
    </bean>

控制器API如下:

@RequestMapping(value = "/groups", method = RequestMethod.GET)
public @ResponseBody
List<Group> getGroups() throws Exception {
    log.info("Getting all the groups");
    return myService.getAllGroups();
}

这很好用,我唯一担心的是序列化的数据量。 Jack对象序列化了Group对象的所有属性。

将@JsonIgnore用于不需要的属性就像静态绑定一样。因为它会忽略@JsonIgnore的属性,以便为将组提供给客户端的所有请求进行序列化。 (例如:要在下拉列表中填充组,只有他们的ID和名称就足够了,但要在客户端上完全填充它作为配置文件,我需要所有数据)

所以我的偏好是特定于STRUTS的配置,可以应用于每个请求。

1 个答案:

答案 0 :(得分:0)

最简单的方法是创建一个新的GroupResource类,其中只包含您希望从API返回的字段,并在控制器方法中从Group转换为GroupResource

这允许您显式控制应用程序代码中序列化为JSON的内容,而不是依赖于Jackson序列化程序的注释和配置。