什么是JSON

JSON是我们在开发过程中前后端交互的过程中数据传输的一个格式,给数据一个统一的格式有利于我们编写和解析数据。

JSON实例使用

1、JavaScript中对象和字符串的相互转化

JSON可以将一个对象转换成一个字符串的形式,调用JSON的stringify()方法就可以实现,(会乱码需配置springmvc的配置文件,当然也可以通过修改@RequestMapping的produces属性)例如:

  1. <script type="text/javascript">
  2. //varconstlet
  3. //js对象
  4. const person = {
  5. name: "caoxauo",
  6. age: "21",
  7. gender: "男"
  8. };
  9. // js对象转化为json字符串
  10. const str = JSON.stringify(person);
  11. console.log("js to json is :"+str);
  12. </script>
  1. <!--JSON乱码问题配置-->
  2. <mvc:annotation-driven>
  3. <mvc:message-converters register-defaults="true">
  4. <bean class="org.springframework.http.converter.StringHttpMessageConverter">
  5. <constructor-arg value="UTF-8"/>
  6. </bean>
  7. <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
  8. <property name="objectMapper">
  9. <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
  10. <property name="failOnEmptyBeans" value="false"/>
  11. </bean>
  12. </property>
  13. </bean>
  14. </mvc:message-converters>
  15. </mvc:annotation-driven>
  1. @RequestMapping(value = "/json",produces = "application/json;charset=utf-8")

控制台输出为:
image.png
同样的既然可以给它转成字符串,那么我就应该具备可以给它转回的能力,调用JSON的parse()方法解析字符串就可以实现,例如:

<script type="text/javascript">
        // json字符串转回对象
    const obj = JSON.parse(str);
    console.log("json to js is :")
    console.log(obj);
</script>

控制台输出为:
image.png

2、Java中的JSON使用

2-1、对于单个Java实例化对象的转化

创建一个简单的实体类User。
注解解释:@AllArgsConstructor 是lombok中的注解,可以让你已经声明的字段参数去构造函数。
@NoArgsConstructor 也是lombok的注解,产生午餐构造函数。
@Data省略掉的Get()、Set()、toString()方法。

package...
import...

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {

    private String name;
    private String gender;
    private int age;
}

lombok是一个工具,需要导入相应的依赖。

                <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.20</version>
            <scope>provided</scope>
        </dependency>

这里引用了一个处理JSON的工具类Jackson(很多这样的工具还有阿里的FastJson等等),导入相应的依赖。

                <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.12.2</version>
        </dependency>

我们在使用Jackson的条件下处理JSON数据需要一个ObjectMapper对象,这里使用writeValueAsString()方法将我么创建的对象转为字符串,运行程序通过我们的请求映射/json显示结果。

@Controller
//@RestController 直接返回一个字符串 等同于 @Controller和@ResponseBody配合使用的结果;使用@RestController 不走视图解析器。
public class jsonController {

    @RequestMapping("/json")
    @ResponseBody
    public String jsonTest() throws JsonProcessingException {

        User user = new User("名字","男",21);

        ObjectMapper mapper = new ObjectMapper();
        String str = mapper.writeValueAsString(user);
        return str;
    }
}

image.png

2-2、对于一个对象的集合的转化

对于单个的对象我们可以通过ObjectMapper.writeValueAsString()方法来转化,那么我们需要对不止一个对象转化呢,可以借助ArrayList对对象进行存储,然后对这个集合进行转化。

    @RequestMapping("/json1")
    @ResponseBody
    public String jsonTest1() throws JsonProcessingException {

        ArrayList<User> userList = new ArrayList<User>();
        User user1 = new User("一号","男",21);
        User user2 = new User("二号","男",21);
        User user3 = new User("三号","男",21);
        userList.add(user1);
        userList.add(user2);
        userList.add(user3);

        ObjectMapper mapper = new ObjectMapper();
        String str = mapper.writeValueAsString(userList);
        return str;
    }

image.png

2-3、对时间对象Date()进行转化

对于时间这样有特殊格式或者可以自定义格式的对象的转化。任然使用ObjectMapper.writeValueAsString()方法来转化。

    @RequestMapping("/json2")
    @ResponseBody
    public String jsonTest2() throws JsonProcessingException {

        Date d = new Date();
        ObjectMapper mapper = new ObjectMapper();
        String str = mapper.writeValueAsString(d);
        System.out.println("当前时间:"+d);//输出检查
        return str;
    }

image.png
结果并不是本地的时间格式转化成的字符串,而是以时间戳的形式展示出来即1970年1月1日至今的毫秒数,但我们print出来的是Tue Apr 13 00:00:58 CST 2021,我们可以使用SimpleDateFormat()方法来格式化时间,然后再使用ObjectMapper.writeValueAsString()方法进行转化。在ObjectMapping中有对时间解析格式进行默认规定为时间戳的操作,可以通过设置关闭然后在设置格式后再进行转化。

    @RequestMapping("/json3")
    @ResponseBody
    public String jsonTest3() throws JsonProcessingException {

        Date date = new Date();

        ObjectMapper mapper = new ObjectMapper();
        SimpleDateFormat dateFormat = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
        System.out.println(dateFormat.format(date));//输出检查
        return mapper.writeValueAsString(dateFormat.format(date));

        /*//另一种方式转换格式
        ObjectMapper mapper = new ObjectMapper();
        //时间解析默认格式 false 关闭
        mapper.configure(SerializationFeature.CLOSE_CLOSEABLE,false);
        SimpleDateFormat dateFormat = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
        mapper.setDateFormat(dateFormat);
        String str = mapper.writeValueAsString(date);
        return str;*/
    }