zoukankan      html  css  js  c++  java
  • SpringMVC学习(四)

    JSON

    JSON简介

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

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

    简洁和清晰的层级结构使得JSON成为理想的数据交换格式。

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

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

    JSON的要求和语法格式:

    • 对象表示为键值对,数据有逗号分隔
    • 大括号保存对象
    • 方括号保存数组

    JSON和JavaScript对象互转

    JSON字符串---->JavaScript对象

    使用JSON.parse()方法

    var obj = JSON.parse('{"a": "Hello", "b": "World"}');
    //结果为 {a: "Hello", b: "World"}
    

    JavaScript对象---->JSON字符串

    使用JSON.stringify()方法

    car json = JSON.stringify({a: "Hello", b: "World"});
    //结果为 '{"a": "Hello", "b": "World"}'
    

    代码实现互转

    在web页面下新建一个json-1.html页面

    var user = {
        name: "张三",
        age: 5,
        sex: "男"
    };
    
    var json = JSON.stringify(user);
    console.log(json)
    
    var obj = JSON.parse(json);
    console.log(obj)
    

    使用IDEA打开,查看控制台输出!

    使用Jackson

    Jackson是比较好的json解析工具

    我们这里使用Jackson,需要导入它的jar包

    <dependency>
         <groupId>com.fasterxml.jackson.core</groupId>
         <artifactId>jackson-databind</artifactId>
         <version>2.10.0</version>
    </dependency>
    

    实现对象转为JSON字符串

    package com.star.controller;
    
    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.star.pojo.User;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController //使用这个注解不通过视图解析器,直接返回方法对应的类型
    public class UserController {
    
        @RequestMapping("/j1") //这里返回一个字符串
        public String json() throws JsonProcessingException {
            
            //创建一个User对象
            User user = new User("张三", 10, "男");
            
            //创建一个jackson的对象映射器,用来解析数据
            ObjectMapper mapper = new ObjectMapper();
            
            //将我们的对象解析为json格式
            String string = mapper.writeValueAsString(user);
    
            return string;
        }
    }
    

    启动测试!

    发现有乱码问题,我们可以使用两种方法解决:

    注解解决乱码问题

    修改@RequestMapping注解

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

    这种方式比较麻烦,如果项目中有许多的请求则每一个一个都要添加,可以通过配置文件统一只当。

    2、配置文件统一解决乱码问题

    <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>
    

    集合转为JSON字符串

        @RequestMapping("/j2")
        public String json2() throws JsonProcessingException {
    
            User user1 = new User("张三1号", 10, "男");
            User user2 = new User("张三2号", 10, "男");
            User user3 = new User("张三3号", 10, "男");
            User user4 = new User("张三4号", 10, "男");
    
            ArrayList<User> users = new ArrayList<User>();
            users.add(user1);
            users.add(user2);
            users.add(user3);
            users.add(user4);
    
            ObjectMapper mapper = new ObjectMapper();
            String string = mapper.writeValueAsString(users);
    
            return string;
        }
    

    启动测试:

    时间对象转为JSON字符串

        @RequestMapping("/j3")
        public String json3() throws JsonProcessingException {
    
            Date date = new Date();
    
            ObjectMapper mapper = new ObjectMapper();
            String string = mapper.writeValueAsString(date);
    
            return string;
        }
    

    启动测试:

    这里默认日期格式会变成一个数字即从1970.1.1到现在的毫秒数!

    我们可以将日期转换为我们想要的格式,有两种方法!

    Java设置格式

        @RequestMapping("/j3")
        public String json3() throws JsonProcessingException {
    
            Date date = new Date();
            //使用SimpleDateFormat类设置格式,调用format方法将时间转为该格式
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String format = sdf.format(date);
    
            ObjectMapper mapper = new ObjectMapper();
            String string = mapper.writeValueAsString(format);
    
            return string;
        }
    

    启动测试:

    显示成功!

    Jackson设置格式

    Jackson 默认是会把时间转成timestamps形式,我们可以在代码中取消默认的格式

        @RequestMapping("/j3")
        public String json3() throws JsonProcessingException {
    
            Date date = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    
            ObjectMapper mapper = new ObjectMapper();
            //取消默认的时间格式
            mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
            //定义时间格式为自定义的
            mapper.setDateFormat(sdf);
            //将时间对象转为JSON字符串
            String string = mapper.writeValueAsString(date);
    
            return string;
        }
    

    启动测试:

    显示成功!

    这两种方法都可以,可以自己选择!

    抽取工具类

    如果要经常使用的话,这样是比较麻烦的,我们可以将这些代码封装到一个工具类中

    package com.star.utils;
    
    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.databind.SerializationFeature;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    public class JsonUtils {
    
        public static String getJson(Object object){
            return getJson(object,"yyyy-MM-dd HH:mm:ss");//默认格式
        }
    
        public static String getJson(Object object, String dateFormat){
    
            ObjectMapper mapper = new ObjectMapper();
            //取消默认的时间格式
            mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    
            //自定义日期格式
            SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
            mapper.setDateFormat(sdf);
    
            try {
                return mapper.writeValueAsString(object);
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
            return null;
        }
    }
    

    现在我们使用工具类,代码就更简洁了!

        @RequestMapping("/j4")
        public String json4() throws JsonProcessingException {
    
            Date date = new Date();
    
            return JsonUtils.getJson(date);
        }
    

    我们也可以修改集合的方法

        @RequestMapping("/j2")
        public String json2() throws JsonProcessingException {
    
            User user1 = new User("张三1号", 10, "男");
            User user2 = new User("张三2号", 10, "男");
            User user3 = new User("张三3号", 10, "男");
            User user4 = new User("张三4号", 10, "男");
    
            ArrayList<User> users = new ArrayList<User>();
            users.add(user1);
            users.add(user2);
            users.add(user3);
            users.add(user4);
    
            return JsonUtils.getJson(users)
        }
    

    使用Fastjson

    fastjson.jar是阿里开发的一款专门用于Java开发的包,可以方便的实现json对象与JavaBean对象的转换,实现JavaBean对象与json字符串的转换,实现json对象与json字符串的转换。实现json的转换方法很多,最后的实现结果都是一样的。

    导入依赖:

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.58</version>
    </dependency>
    

    FastJson三个主要的类:

    • JSONObject代表json独对象

      • JSONObject实现类Map接口
      • JSONObject对应json对象,通过各种形式的get()方法可以获取json对象中的数据,也可以利用诸如size(),isEmpty()等方法获取"键: 值"对的个数和判断是否为空。其本质是通过实现Map接口并调用接口中的方法完成的。
    • JSONArray 代表json对象数组

      • 内部是由List接口中的方法来完成操作的
    • JSON代表JSONObject和JSONArray的转换

      • JSON类源码分析和使用
      • 仔细观察这些方法,主要是实现json对象,json对昂数组,javabean对象,json字符串之间的相互转化。

    代码测试

        @RequestMapping("/fj1")
        public String json(){
    
            User user1 = new User("张三1号", 10, "男");
            User user2 = new User("张三2号", 10, "男");
            User user3 = new User("张三3号", 10, "男");
            User user4 = new User("张三4号", 10, "男");
    
            ArrayList<User> users = new ArrayList<User>();
            users.add(user1);
            users.add(user2);
            users.add(user3);
            users.add(user4);
    
            String string = JSON.toJSONString(users);
    
            return string;
        }
    

    启动测试:

    常用的转换:

    Java对象 ===> JSON字符串

    JSON.toJSONString(object)

    JSON字符串 ===> Java对象

    JSON.paresObject(json, object.class)

    Java对象 ===> JSON对象

    (JSONObject) JSON.toJSON(object)

    JSON对象 ===> Java对象

    JSON.toJavaObject(jsonObject, object.class)

    这种工具类,我们只需要掌握使用就好了,在使用的时候在根据具体的业务去找对应的实现。拿来用就好了!

  • 相关阅读:
    使用CustomValidate自定义验证控件
    C#中金额的大小写转换
    Andriod出错之Unable to build: the file dx.jar was not loaded from the SDK folder!
    VC 编写的打字练习
    机房工作笔记Ping只有单向通
    web服务协同学习笔记(1)
    Dll 学习3 将MDI子窗口封装在DLL中
    机房工作学习文件共享
    Andriod出错之Failed to find an AVD compatible with target 'Android 2.2'
    Andriod出错之wrapper was not properly loaded first
  • 原文地址:https://www.cnblogs.com/lmx-181028/p/12505507.html
Copyright © 2011-2022 走看看