什么是JSON

导读:本篇文章讲解 什么是JSON,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

什么是JSON

前后端分离时代:
后端部署后端,提供接口,提供数据

			JSON

前端独立部署,负责渲染后端的数据

JSON就好像桥梁一样链接着前后端的数据

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

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

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

2:JSON键值对

JSON键值对是用来保存JavaScript对象的一种方式,和JavaScript对象的写法也大同小异,键/值对组合中的键名写在前面并用双引号” “包裹,使用冒号∶分隔,然后紧接着值:
{“name”:”幺鸡”}
{“age”:”18”}
{“sex”:”男”}

很多人搞不清楚JSON和JavaScript对象的关系,甚至连谁是谁都不清楚。其实,可以这么理解:

  • JSON是JavaScript对象的字符串表示法,它使用文本表示一个JS对象的信息,本质是一个字符串。
    Var obj = {a : ”hello”, b : “word”}; //这是一个对象,注意简明也是可以用引号包裹的
    Var json = ‘{“a” : “hello”, “b”: “word”}’; //这是一个JSON字符串,本质就是一个字符串。

JSON和JavaScript对象转换

  • 要想实现JSON字符串转换成JavaScript对象,要使用JSON.parse()方法:
    var obj = JSON. parse( ’ { “a”: “Hello”,“b”: “world””)’);
    //结果是{a: ” He1lo” , b: “world” }
  • 要实现从JavaScript对象转换为JSON字符串,使用JSON.stringify()方法:
    var json = JSON .stringify({a: ” Hello” , b: “world” });
    //结果是 ‘{“a” : “hello”, “b”: “word”}’

代码测试:
1:创建一个新的web项目;
2:在web创建一个新的 .html页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<script type="text/javascript">

    //编写一个JavaScript对象
    var user = {
        name:"铁锤",
        age:3,
        sex:"男"
    };

    console.log(user);

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

    console.log("==========");

    //将JSON对象转换成js对象
    var parse = JSON.parse(json);
    console.log(parse);

</script>

</body>
</html>

测试结果:
在这里插入图片描述
Controller返回JSON数据

  • Jackson应该是目前比较好的json解析工具了
  • 当然工具不止这—个,比如还有阿里巴巴的fastjson等等。·我们这里使用Jackson,使用它需要导入它的jar包;

Jackson的使用
1: 创建一个新的web项目;导入jackson依赖

 <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.13.1</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.22</version>
        </dependency>

2:配置SpringMVC,

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc
       https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--自动扫描包-->
    <context:component-scan base-package="com.baidu.controller"/>

    <!-- 视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          id="internalResourceViewResolver">
        <!-- 前缀 -->
        <property name="prefix" value="/WEB-INF/jsp/" />
        <!-- 后缀 -->
        <property name="suffix" value=".jsp" />
    </bean>
</beans>

3:创建一个controller包,新建一个类


/**
 * 返回一个普通的字符串
 */
//@Controller  他会走视图解析器
@RestController  //他直接返回一个字符串
public class UserController {

//    @RequestMapping(value = "/j1" ,produces = "application/json;charset=utf-8")
    @RequestMapping("/j1")
    @ResponseBody//(配合Controller使用的)它就不会走视图解析器,会返回一个字符串
    public String json1() throws JsonProcessingException {

        //Jackson,   ObjectMapper
        ObjectMapper mapper = new ObjectMapper();

        User user = new User("铁锤",18,"男");

        String str = mapper.writeValueAsString(user);

        return str;
    }

注意:这里将会有的一个JSON的乱码问题:

解决:1:在配置文件中配置解决JSON乱码问题的配置(推荐这一种方法)

<!--JSON乱码问题配置-->
<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>

2:就是在RequestMapping查看源码,有一个 produces()方法;可以在设置

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

这样也可以解决乱码问题
在这里插入图片描述
启动TomCat:测试结果
在这里插入图片描述
这里返回一个普通的字符串:如果是一个对象可以返回吗?

    //返回一个对象的字符串
    @RequestMapping("/j2")
    public String json2() throws JsonProcessingException {

        ObjectMapper mapper = new ObjectMapper();

        ArrayList<User> userList = new ArrayList<>();

        User user1 = new User("铁锤",18,"男");
        User user2 = new User("铁锤",18,"男");
        User user3 = new User("铁锤",18,"男");
        User user4 = new User("铁锤",18,"男");

        userList.add(user1);
        userList.add(user2);
        userList.add(user3);
        userList.add(user4);

        String string = mapper.writeValueAsString(userList);


        return string;//new ObjectMapper().writeValueAsString(userList);
    }

测试:
在这里插入图片描述
返回一个时间的字符串

    //返回一个时间的字符串
    @RequestMapping("/j3")
    public String json3() throws JsonProcessingException {
        //1:传统的java程序解决
        //2:使用ObjectMapper 来格式化输出

        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(SerializationFeature.CLOSE_CLOSEABLE,false);

        //自定义日期的格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        mapper.setDateFormat(sdf);

        Date date = new Date();

        //ObjectMapper   ,时间解析后的默认格式是 Timestamp:时间戳

        return  mapper.writeValueAsString(date);//new ObjectMapper().writeValueAsString(userList);
    }

测试结果:
在这里插入图片描述
注意:这里会遇到一个时间的戳的输出,从1970年开始的时间戳:
解决方法:
1:传统的java程序解决(好使)

  //自定义日期的格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 return  mapper.writeValueAsString(sdf.format(date));//new ObjectMapper().writeValueAsString(userList);

2:使用ObjectMapper 来格式化输出

  ObjectMapper mapper = new ObjectMapper();
  mapper.configure(SerializationFeature.CLOSE_CLOSEABLE,false);

//自定义日期的格式
 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 mapper.setDateFormat(sdf);
        
 return  mapper.writeValueAsString(date);

封装ObjectMapper

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.CLOSE_CLOSEABLE,false);

        //自定义日期的格式
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
        mapper.setDateFormat(sdf);

        try {
            return mapper.writeValueAsString(object);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }

        return null;
    }

往后就可以直接用了;

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/71918.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!