IT虾米网

SpringMVC之JSON

十六七八 2022年11月07日 编程语言 140 0

一、什么是JSON

  • JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式,目前使用特别广泛。
  • 采用完全独立于编程语言的文本格式来存储和表示数据。
  • 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。
  • 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

在 JavaScript 语言中,一切都是对象。因此,任何JavaScript 支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。看看他的要求和语法格式:

  • 对象:{'bid':1,'bname':'java入门到入土'} 
  • 数组:{1,2,3,4,5..} 
  • 混合:{'total':81,row:[{'bid':1,'bname':'java入门到入土'},{'bid':2,'bname':'php入门到入土'}...]}

二、SpringMVC中JSON的配置环境

1.在pom.xl中导入JSON依赖

    <!--<json.version>2.9.3</json.version>--> 
    <!--jackson--> 
    <dependency> 
      <groupId>com.fasterxml.jackson.core</groupId> 
      <artifactId>jackson-databind</artifactId> 
      <version>${jackson.version}</version> 
    </dependency> 
    <dependency> 
      <groupId>com.fasterxml.jackson.core</groupId> 
      <artifactId>jackson-core</artifactId> 
      <version>${jackson.version}</version> 
    </dependency> 
    <dependency> 
      <groupId>com.fasterxml.jackson.core</groupId> 
      <artifactId>jackson-annotations</artifactId> 
      <version>${jackson.version}</version> 
    </dependency> 

2.在spring核心控制器中配置JSON消息转换器

    <!--但是,从spring3.1开始DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter的使用已经过时--> 
    <!--spring3.1开始我们应该用RequestMappingHandlerMapping来替换DefaultAnnotationHandlerMapping,--> 
    <!--spring3.1开始我们应该用用RequestMappingHandlerAdapter来替换AnnotationMethodHandlerAdapter--> 
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> 
        <property name="messageConverters"> 
            <list> 
                <ref bean="mappingJackson2HttpMessageConverter"/> 
            </list> 
        </property> 
    </bean> 
    <bean id="mappingJackson2HttpMessageConverter" 
          class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> 
        <!--处理中文乱码以及避免IE执行AJAX时,返回JSON出现下载文件--> 
        <property name="supportedMediaTypes"> 
            <list> 
                <value>text/html;charset=UTF-8</value> 
                <value>text/json;charset=UTF-8</value> 
                <value>application/json;charset=UTF-8</value> 
            </list> 
        </property> 
    </bean>

三、Controller返回多种类型的JSON数据

在请求处理方法中添加@ResponseBody注解,将返回结果直接转换成JSON

注:此请求处理方法返回的已经不是视图了

1.返回List<T>类型的JSON数据

    /** 
     * 返回List<T>类型的Json数据 
     * @param book 
     * @param req 
     * @return 
     */ 
    @RequestMapping("/queryListBook") 
    @ResponseBody 
    public List<Book> queryListBook(Book book,HttpServletRequest req){ 
        PageBean pageBean=new PageBean(); 
        pageBean.setRequest(req); 
        List<Book> books=bookService.queryBookPager(book,pageBean); 
        return books; 
    }

2.返回Map类型的JSON数据

    /** 
     * 返回Map类型的JSON数据 
     * @param bid 
     * @return 
     */ 
    @RequestMapping("/querySingleMap") 
    @ResponseBody 
    public Map<String,Object> querySingleMap(Integer bid){ 
        return bookService.querySingleMap(bid); 
    }

3.返回List<Map<String,Object>>类型的JSON数据

    /** 
     * 返回List<Map<>>类型的JSON数据 
     * @return 
     */ 
    @RequestMapping("/queryMapList") 
    @ResponseBody 
    public List<Map<String,Object>> queryMapList(){ 
        return bookService.queryMapList(); 
    }

4.返回对象类型的JSON数据

     /** 
     * 返回对象类型的JSON数据 
     * @param bid 
     * @return 
     */ 
    @RequestMapping("/querySingleBook") 
    @ResponseBody 
    public Book querySingleBook(Integer bid){ 
        Book book=bookService.selectByPrimaryKey(bid); 
        return book; 
    }

5.返回String类型的JSON数据

     /** 
     * 返回String类型的Json数据 
     * @return 
     */ 
    @RequestMapping("/queryStr") 
    @ResponseBody 
    public String queryStr(){ 
 
        return "book/bookList"; 
    }

6.返回混合类型的JSON数据

     /** 
     * 返回混合类型的Json数据 
     * @param book 
     * @param req 
     * @return 
     */ 
    @RequestMapping("/queryListBook1") 
    @ResponseBody 
    public Map<String,Object> queryListBook1(Book book,HttpServletRequest req){ 
        PageBean pageBean=new PageBean(); 
        pageBean.setRequest(req); 
        List<Book> books=bookService.queryBookPager(book,pageBean); 
        Map<String,Object> json=new HashMap<>(); 
        json.put("total",pageBean.getTotal()); 
        json.put("rows",books); 
        return json; 
    }

四、常用注解

1.@ResponseBody

作用:绕开视图解析器,将java对象转为json格式的数据。

  • 不加@ResponseBody,是将方法返回的值作为视图名称,并自动匹配视图去显示
  • 加上@ResponseBody就仅仅是将方法返回值当作内容直接返回到客户端,并且会自适应响应头的content-type,返回的字符串符合json

加上之后的content-type就是application/json

如果是普通字符串,就是text/plain

但是加上注解属性produces=application/json,那么不管内容是什么格式,响应头的content-type就一直是application/json,不再去做自适应,至于内容是不是json都不重要了

 2.@JsonIgnore

作用:用来忽略某些字段,可以用在变量或者Get方法上,用在Set方法时,和变量效果一样。这个注解一般用在我们要忽略的字段上。

使用场景:springboot项目中定义了很多类,我们在rest返回中直接返回或者在返回对象中使用这些类,spring已经使用jackson自动帮我们完成这些的to json。但是有时候自动转的json内容太多,或者格式不符合我们的期望,因此需要调整类的to json过程,或者说希望自定义类的json过程。

3.@JsonFormat

作用:帮我们完成格式转换

例如对于Date类型字段,如果不适用JsonFormat默认在rest返回的是long,如果我们使用@JsonFormat(timezone = “GMT+8”, pattern = “yyyy-MM-dd HH:mm:ss”),就返回"2018-11-16 22:58:15"

4.@JsonProperty

作用:在返回实体类的JSON数据格式时,给此字段取别名 只在返回实体类时有效


本文参考链接:https://blog.csdn.net/weixin_57504000/article/details/124071694
评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!