Spring MVC返回的json去除根节点名称的方法

使用Spring MVC构建RESTful接口时,通常会使用JSON作为数据格式进行传输。在返回JSON数据时,往往希望去掉根节点名称以减少数据传输量,提高接口访问速度。下面是实现此功能的完整攻略:

使用Spring MVC构建RESTful接口时,通常会使用JSON作为数据格式进行传输。在返回JSON数据时,往往希望去掉根节点名称以减少数据传输量,提高接口访问速度。下面是实现此功能的完整攻略:

1. 设置消息转换器

Spring MVC默认会使用Jackson库进行JSON数据的序列化和反序列化。 在控制器方法中,我们可以使用@ResponseBody注解将返回值转换为JSON对象。为了去掉根节点名称,我们需要修改Jackson的默认设置,在消息转换器中设置此功能。

在Spring MVC的配置文件中添加以下配置:

<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="prefixJson" value="false" />
            <property name="supportedMediaTypes">
                <list>
                    <value>application/json;charset=UTF-8</value>
                </list>
            </property>
            <property name="objectMapper">
                <bean class="com.fasterxml.jackson.databind.ObjectMapper">
                    <property name="serializationInclusion" value="NON_NULL" />
                    <property name="dateFormat">
                        <bean class="java.text.SimpleDateFormat">
                            <constructor-arg value="yyyy-MM-dd HH:mm:ss"/>
                        </bean>
                    </property>
                </bean>
            </property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

注意,其中的prefixJson属性需要设置为false,表示不需要在JSON数据前添加根节点名称。

2. 编写返回数据对象

我们需要编写一个POJO对象,作为返回JSON数据的容器。在这个对象中,需要使用@JsonRootName注解来指定根节点的名称。这个注解可以指定多个名称,表示可以根据客户端提供的条件动态替换根节点名称。

下面是一个示例:

@JsonRootName("user")
public class UserDTO {
    private int id;
    private String name;
    // getter和setter方法
}

在这个示例中,我们使用@JsonRootName注解指定了“user”作为根节点名称。

3. 控制器方法返回值

在控制器方法中,我们可以直接返回编写好的POJO对象,Spring MVC会将其自动转换为JSON格式的数据。同时,Jackson库会自动检测到@JsonRootName注解,并根据其指定的名称来进行根节点的处理。

下面是一个示例:

@RestController
@RequestMapping("/users")
public class UserController {
    @GetMapping("/{id}")
    public UserDTO getUserById(@PathVariable int id) {
        UserDTO user = userService.getUserById(id);
        return user;
    }
}

在这个示例中,getUserById方法返回了一个UserDTO对象。这个对象的属性被序列化为JSON格式的数据,并自动去掉了根节点名称。

4. 多个根节点的处理

在返回数据对象中,我们使用@JsonRootName注解来指定根节点的名称。如果我们需要根据客户端提供的不同条件动态更改根节点名称,需要编写自定义的消息转换器。

以Spring Boot为例,我们可以编写如下的消息转换器:

@Configuration
public class AppConfig {
    @Bean
    public HttpMessageConverters customConverters() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true);
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

        MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
        jsonConverter.setObjectMapper(objectMapper);

        return new HttpMessageConverters(jsonConverter) {
            @Override
            public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
                super.configureMessageConverters(converters);

                for (HttpMessageConverter<?> converter : converters) {
                    if (converter instanceof MappingJackson2HttpMessageConverter) {
                        MappingJackson2HttpMessageConverter jsonConverter = (MappingJackson2HttpMessageConverter) converter;
                        jsonConverter.setPrefixJson(false);
                    }
                }
            }
        };
    }
}

其中,我们使用了MappingJackson2HttpMessageConverter类来定义消息转换器。这个类可以设置多个根节点名称,以便根据客户端提供的条件动态更改根节点名称。

如果需要指定根节点名称,可以在控制器方法中返回一个Map对象,其中键是根节点名称,值是返回数据,示例:

@GetMapping("/users")
public Map<String, List<UserDTO>> getUsers() {
    List<UserDTO> userList = userService.getUserList();
    Map<String, List<UserDTO>> resultMap = new HashMap<>();
    resultMap.put("data", userList);
    return resultMap;
}

在这个示例中,我们返回了一个Map对象,其中键为“data”,值为用户列表。这个Map对象会被自动序列化为JSON格式的数据,其中的键“data”会作为根节点名称出现在数据中。

总结一下,实现Spring MVC返回的JSON数据去掉根节点名称的方法,需要对消息转换器进行配置,并在返回数据对象上使用@JsonRootName注解。在控制器方法中,可以直接返回数据对象或Map对象,以实现根节点名称的动态更改。

本文标题为:Spring MVC返回的json去除根节点名称的方法

基础教程推荐