SpringMVC学习 && JSON

这篇博客探讨了JSON作为数据交换格式的广泛应用及其特点,包括简洁的层次结构和跨语言兼容性。内容涵盖了JSON的数据类型,如字符串、数字、对象和数组,以及其与JavaScript对象的关系。文章还通过示例介绍了如何在Java的SpringMVC中使用Jackson和Fastjson进行JSON对象和JavaScript对象之间的转换,并解决了中文乱码问题,提供了两种不同的解决方案。
摘要由CSDN通过智能技术生成

JSON(JavaScript Object Notation,JS对象标记)是一种轻量级的数据交换格式,目前使用特别广泛

特点:

  • 采用完全独立于编程语言的文本格式来储存和表示数据

  • 简洁和清晰的层次结构使得JSON成为理想的数据交换语言

  • 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率

数据类型:

  • 在JavaScript语言中,一切都是对象。任何JavaScript支持的类型都可以通过JSON来表示
  • 字符串、数字、对象、数组等

要求和语法格式:

  • 对象表示为键值对,数据由逗号分隔
  • 花括号保存对象
  • 方括号保存数组
{"name":"海燕酱"}
{"age":"21"}

和JavaScript对象关系:

  • JSON是JavaScript对象的字符串表示,使用文本表示一个JS对象的信息,本质是一个字符串
var obj = {a: 'Hello', b: 'World'}; //这是一个对象,注意键名也是可以使用引号包裹的
var json = '{"a": "Hello", "b": "World"}'; //这是一个 JSON 字符串,本质是一个字符串
  • JavaScript对象和JSON对象相互转换测试代码:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!--script标签没有自闭合-->
    <script type="text/javascript">
        //编写一个JavaScript对象
        var user = {
            name:"海燕酱",
            age:3,
            sex:"女"
        };

        //将js对象转换为json对象
        var json = JSON.stringify(user);
        console.log(json);

        //将json对象转换为js对象
        var obj = JSON.parse(json);
        console.log(obj);
    </script>

</head>
<body>

</body>
</html>

​ 测试结果:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hdQgUEd2-1597068814930)(E:/Typora/image-20200604122219041.png)]

 

Jackson使用:

  1. 导入Jackson所需依赖
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.11.0</version>
</dependency>
  1. 编写Controller
/*如果使用@RestController可以使得所有的方法都返回json字符串,不用每个方法都加@ResponseBody了*/
@Controller
public class UserController {
    @RequestMapping("/u1")
    /*@ResponseBody不会走视图解析器,会直接返回一个字符串*/
    @ResponseBody
    public String json() throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        User user = new User("海燕酱", 21, "女");
        String str = mapper.writeValueAsString(user);

        return str;
    }
}
  1. 测试结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p0F1pqEd-1597068814932)(E:/Typora/image-20200604130757643.png)]
 

中文乱码问题解决:

方式一:在映射的时候改变编码方式

@RequestMapping(value ="/u1",produces = "application/json;charset=utf-8")

测试结果:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FsgYvENK-1597068814934)(E:/Typora/image-20200604132145266.png)]

 

方法二:在springmvc-servlet中进行统一配置

<mvc:annotation-driven>
   <mvc:message-converters register-defaults="true">
       <bean class="org.springframework.http.converter.StringHttpMessageConverter">
           <constructor-arg value="UTF-8"/>
       </bean>
       <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
           <property name="objectMapper">
               <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
                   <property name="failOnEmptyBeans" value="false"/>
               </bean>
           </property>
       </bean>
   </mvc:message-converters>
</mvc:annotation-driven>

 
Fastjson三个主要的类:

  • JSONObject代表json对象
    • JSONObject实现了Map接口, 猜想 JSONObject底层操作是由Map实现的
    • JSONObject对应json对象,通过各种形式的get()方法可以获取json对象中的数据,也可利用诸如size(),isEmpty()等方法获取"键:值"对的个数和判断是否为空。其本质是通过实现Map接口并调用接口中的方法完成的
  • JSONArray代表json对象数组
    • 内部是有List接口中的方法来完成操作的
  • JSON代表JSONObject和JSONArray的转化
    • 在JSON类源码中可以看到JSON类主要是实现json对象、json对象数组、javabean对象、json字符串之间的相互转化
       

Fastjson使用:

  1. 导入fastjson依赖
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.70</version>
</dependency>
  1. 编写Controller
@RestController
public class UserController {
    @RequestMapping(value ="/u1",produces = "application/json;charset=utf-8")
    public String json() throws JsonProcessingException {
        //创建一个对象
        User user1 = new User("海燕酱1号", 3, "女");
        User user2 = new User("海燕酱2号", 3, "女");
        User user3 = new User("海燕酱3号", 3, "女");
        User user4 = new User("海燕酱4号", 3, "女");
        List<User> list = new ArrayList<User>();
        list.add(user1);
        list.add(user2);
        list.add(user3);
        list.add(user4);

        System.out.println("*******Java对象 转 JSON字符串*******");
        String str1 = JSON.toJSONString(list);
        System.out.println("JSON.toJSONString(list)==>"+str1);
        String str2 = JSON.toJSONString(user1);
        System.out.println("JSON.toJSONString(user1)==>"+str2);

        System.out.println("\n****** JSON字符串 转 Java对象*******");
        User jp_user1=JSON.parseObject(str2,User.class);
        System.out.println("JSON.parseObject(str2,User.class)==>"+jp_user1);

        System.out.println("\n****** Java对象 转 JSON对象 ******");
        JSONObject jsonObject1 = (JSONObject) JSON.toJSON(user2);
        System.out.println("(JSONObject) JSON.toJSON(user2)==>"+jsonObject1.getString("name"));

        System.out.println("\n****** JSON对象 转 Java对象 ******");
        User to_java_user = JSON.toJavaObject(jsonObject1, User.class);
        System.out.println("JSON.toJavaObject(jsonObject1, User.class)==>"+to_java_user);

        return "hello";
    }
}
  1. 测试结果[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VSdctDv0-1597068814936)(E:/Typora/image-20200604140816403.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZCKxqKFW-1597068814938)(E:/Typora/image-20200604141003643.png)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值