zoukankan      html  css  js  c++  java
  • JsonView 与JsonIgnore 使用

     简述:现在项目多采用前后分离方式  那么前后端的数据传输几乎都采用的是json形式的

              那么我们在查询数据返回专为json的形式时候有时候需要忽略某些字段,我们如何来做那?????

              通常采用的json 转换方式有两种分别是fastjson  和jackjson两种

    1、直接转为json时候任何时候都不需要当前字段做为json转换

        @JsonIgnore   我这里采用的jackjson

        使用方式

    控制器

    输出结果:

     分析结果可知  当我门在某一个属性添加@JsonIgnore注解的时候  我们会发现专为json的结果集对象里面不包含我们添加了注解的属性

    2、当我们返回结果集中要忽略到某一属性  在返回的详情信息中又包含忽略的属性  我们可以采用@JsonView属性

         @JsonView属性使用规则

          1)必须使用接口声明多个视图

         2)在值对象的get方法上指定视图

         3)在指定的控制器上指定视图

         具体案例如下:

    实体:  

    package lwd.security.dto;
    
    
    import com.fasterxml.jackson.annotation.JsonIgnore;
    import com.fasterxml.jackson.annotation.JsonView;
    import jdk.nashorn.internal.ir.annotations.Ignore;
    
    public class User {
    
        /**
         * 定义一个简单视图
         */
        public interface UserSimpleView{};
    
        /**
         *  定义一个详细视图  继承简单视图
         */
        public interface UserDetailView extends UserSimpleView{};
    
        private String username;
    
        private String password;
    
        private Integer age;
        @JsonIgnore
        private String email;
    
        /**
         *  指定视图
         * @return
         */
        @JsonView(UserSimpleView.class)
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        /**
         * 指定视图
         * @return
         */
        @JsonView(UserDetailView.class)
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        public String getEmail() {
            return email;
        }
    
        public void setEmail(String email) {
            this.email = email;
        }
    }

    控制器定义:

    package lwd.security.user.controller;
    
    import com.fasterxml.jackson.annotation.JsonView;
    import lwd.security.dto.User;
    import lwd.security.dto.UserQueryCondition;
    import org.apache.commons.lang.builder.ReflectionToStringBuilder;
    import org.apache.commons.lang.builder.ToStringStyle;
    
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    
    import org.springframework.web.bind.annotation.RestController;
    
    
    import java.util.ArrayList;
    import java.util.List;
    
    @RestController
    public class UserController {
    
    
        /**
         *  当前控制器中采用了简单视图
         * @param condition
         * @return
         */
        @RequestMapping(value = "/user",method = RequestMethod.GET)
        @JsonView(User.UserSimpleView.class)
        public List<User> query(UserQueryCondition condition){
    
            System.out.println(ReflectionToStringBuilder.toString(condition, ToStringStyle.MULTI_LINE_STYLE));
    
            List<User> users = new ArrayList<>();
            users.add(new User());
            users.add(new User());
            users.add(new User());
            return users;
        }
    
        /**
         *  url采用正则表达式形式  以及jsonview使用  指定了详情视图
         * @param id
         * @return
         */
        @GetMapping("/user/{id:\d+}")
        @JsonView(User.UserDetailView.class)
        public User getInfo(@PathVariable(value = "id")Integer id){
            return new User();
        }
    
        /**
         * 实体忽略属性 jsonIgnore 形式
         * @param id
         * @return
         */
        @GetMapping(value = "/user/get/{id}")
        public User getDetail(@PathVariable(value = "id")String id){
            return new User();
        }
    
    
    
    }

    单元测试:

    package lwd.security.controller;
    
    import org.junit.Before;
    import org.junit.Test;
    import org.junit.experimental.results.ResultMatchers;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.http.MediaType;
    import org.springframework.test.context.junit4.SpringRunner;
    import org.springframework.test.web.servlet.MockMvc;
    import org.springframework.test.web.servlet.MockMvcBuilder;
    import org.springframework.test.web.servlet.RequestBuilder;
    import org.springframework.test.web.servlet.ResultActions;
    import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
    import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
    import org.springframework.test.web.servlet.setup.MockMvcBuilders;
    import org.springframework.web.context.WebApplicationContext;
    
    import java.awt.*;
    
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class UserControllerTest {
    
        @Autowired
        private WebApplicationContext wac;
    
    
        private MockMvc mockMvc;
    
        @Before
        public void setup(){
            mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
        }
    
        @Test
        public void whenQuerySuccess() throws Exception {
    
            mockMvc.perform(MockMvcRequestBuilders.get("/user")
                    .param("username","1111")
                    .contentType(MediaType.APPLICATION_JSON))
                    .andExpect(MockMvcResultMatchers.status().isOk())
                    .andExpect(MockMvcResultMatchers.jsonPath("$.length()").value(3));
    
        }
    
        /**
         * 正则匹配信息
         * @throws Exception
         */
        @Test
        public void whenQuery4XXError() throws Exception {
            mockMvc.perform(MockMvcRequestBuilders.get("/user/1")
                    .contentType(MediaType.APPLICATION_JSON_UTF8))
                    .andExpect(MockMvcResultMatchers.status().isOk());
    
        }
    
        /**
         * 采用简单视图方式
         * @throws Exception
         */
        @Test
        public void whenQueryJsonViewInfo() throws Exception {
            String result = mockMvc.perform(MockMvcRequestBuilders.get("/user/1")
                    .contentType(MediaType.APPLICATION_JSON_UTF8))
                    .andExpect(MockMvcResultMatchers.status().isOk())
                    .andReturn().getResponse().getContentAsString();
            System.out.println(result);
        }
    
        /**
         * 采用详细视图方式
         * @throws Exception
         */
        @Test
        public void whenQueryJsonViewDetailInfo() throws Exception {
            String result = mockMvc.perform(MockMvcRequestBuilders.get("/user")
                    .contentType(MediaType.APPLICATION_JSON_UTF8))
                    .andExpect(MockMvcResultMatchers.status().isOk())
                    .andReturn().getResponse().getContentAsString();
            System.out.println(result);
        }
    
        /**
         * 采用属性忽略方式
         * @throws Exception
         */
        @Test
        public void whenQueryIgnore() throws Exception {
            String result = mockMvc.perform(MockMvcRequestBuilders.get("/user/get/1")
                    .contentType(MediaType.APPLICATION_JSON_UTF8))
                    .andExpect(MockMvcResultMatchers.status().isOk())
                    .andReturn().getResponse().getContentAsString();
    
            System.err.println(result);
        }
    }

    指定详细视图方式结果集:

    指定简单视图方式结果集:

    @JsonView注解  最终专为json的数据只是添加了当前注解的属性字段  没有添加的不会展示出来

        

      

  • 相关阅读:
    Linux crontab 的常用定时方式
    Windows 查看端口及进程信息
    java.io.IOException: com.esotericsoftware.kryo.KryoException
    Linux 如何让挂载的硬盘永久生效
    六边形架构-微服务基石
    包和工具
    谈一谈对java简单的理解
    HTTP报文 「HTTP
    四层 or 七层 「HTTP
    setTimeout不生效
  • 原文地址:https://www.cnblogs.com/lwdmaib/p/12241535.html
Copyright © 2011-2022 走看看