Json

Json

Json是什么

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

采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

在我之前的一篇博客中有所讲解,在我们学习面向对象时,我们往往会创建多个对象,为了判断这些对象是不是同一个对象,通常会采用System.out.println(对象名);语句来直接打印对象的地址来进行判断,实际上系统会默认在我们打印的对象后面加上.toString()来调用toString()方法获取对象的地址值的字符串表现形式。

为了更大程度上发挥toString方法的作用,我们会重写这个从Object类继承过来的方法,这时调用toString方法就可以打印我们的对象中的一些成员变量信息,更有价值,这个时候的toString方法就类似我们这里需要讲解的Json

Json的基本语法

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

  1. 对象表示为键值对

  2. 数据由逗号分隔,最后一个数据不能加逗号

  3. 花括号保存对象

  4. 方括号保存数组

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

代码示例

{"name": "QiangJingzhou"}
{"age": "3"}
{"sex": "男"}

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

JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。

var obj = {a: 'Hello', b: 'World'}; //这是一个对象,注意键名也是可以使用引号包裹的
var json = '{"a": "Hello", "b": "World"}'; //这是一个 JSON 字符串,本质是一个字符串

Json和XML的比较

  1. 可读性:JSON和XML的可读性可谓不相上下,一边是简易的语法,一边是规范的标签形式,很难分出胜负。

  2. 可扩展性:XML天生有很好的扩展性,JSON当然也有,没有什么是XML可以扩展而JSON却不能扩展的。不过JSON在Javascript主场作战,可以存储Javascript复合对象,有着xml不可比拟的优势。

基于上面的两种比较,所以Json大多用在前端进行交互数据,而xml进行环境的配置

Json的代码讲解

在我们之前已经讲过的大项目下创建一个Module,这个子项目是Maven的Web项目,在项目下进线一些目录以及文件的创建,最后的目录结构如图所示
在这里插入图片描述
在json1.html文件中IDE自动生成的结构是

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

</body>
</html>

我们需要在 <body>标签中添加<script>标签,在这个标签里面我们才可以进行Javascript代码的编写

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

<!--type属性其实也可以不需要text/javascript,因为script标签默认是JavaScript-->
<script type="text/javascript">
    //编写一个对象
    var user = {
        name:"qiang",
        age:3,
        sex:"男"
    }
    //输出一下这个对象
    console.log(user)
</script>
</body>
</html>

在编写完成后我们运行这段代码
在这里插入图片描述
在浏览器中点击鼠标右键进行审查元素
在这里插入图片描述可以看到我们之前创建好的JS对象以及对象中的内容

现在我们将JS对象转换为Json字符串

//将JS对象转换为Json字符串
var str = JSON.stringify(user);
console.log(str);

在之前的程序中添加如上所述的代码,不用运行发布,直接刷新网页
在这里插入图片描述可以看到打印的Json字符串为{"name":"qiang","age":3,"sex":"男"},这也对应着我们之前讲解的Json格式

接下来我们将Json字符串解析为JS对象

//接下来我们将Json字符串解析为JS对象
var parse = JSON.parse(str);
console.log(parse);

在原程序中添加上面所述的代码,不用运行发布,直接刷新网页
在这里插入图片描述可以看到我们又将Json字符串转换为了JS对象

Json的用途

现在前后端分离,数据交互异常重要,Json就是王者

我们打开百度搜索界面,在这个界面中按F12键打开控制台,最上一栏选择Network
在这里插入图片描述当我们用鼠标键点击一下搜索栏的时候
在这里插入图片描述就可以看到一个请求,请求类型是xhr,就是异步交互,这是Ajax的底层,查看这个请求
在这里插入图片描述可以看到json以及请求的地址以及请求的方式,我们在搜索栏中输入数字1,可以接受到第2个请求
在这里插入图片描述查看第2个请求的响应
在这里插入图片描述可以看到相应就是Json格式的字符串

但是我们的请求都是以sug开头的,这又是为什么
在这里插入图片描述
点击右键查看源代码,可以看到sugHost后面有一串URL,这就是请求的主机,所以我们的请求都是以sug开头的,我们在百度搜索东西时,我们的动作就会被转换为请求去请求百度的主机,并且带回响应的结果

我们直接请求主机,选中sugHost后面的一串URL点击鼠标右键直接搜索
在这里插入图片描述可以看到返回一个Json字符串,我们请求了一个链接,返回了一个字符串

在这个链接后面有个参数叫wd,我们让这个wd为1,回车
在这里插入图片描述可以看到返回的Json字符串,这就像我们在百度搜索栏中输入1时主机自动返回的数据一样
在这里插入图片描述我们可以修改wd参数来查看其他情况下主机返回的结果,在这里不一一演示

这个请求的参数就像我们之前web程序中的controller包下的类一样,我们可以通过设置response来返回一个Json字符串来起到和上面的讲解类似的功能

将Json用到Web程序中

在我们上面已经创建好的Module中,我们开始编写程序

在之前创建好的目录结构下新建各种配置文件,最终目录结构如下图所示
在这里插入图片描述

1.在编写一个web项目时,先不用导包,最重要的是先配置好web.xml,我们需要写入servlet以及配置过滤器来防止乱码

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
         http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         id="WebApp_ID" version="3.0">


  <servlet>
    <servlet-name>SpringMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--关联SpringMVC配置文件-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc-servlet.xml</param-value>
    </init-param>
    <!--这个东西要和服务器一起启动;
    load-on-startup,启动级别,数字越小级别越高!-->
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>SpringMVC</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

  <!--字符编码过滤-->
  <filter>
    <filter-name>encodingFilter</filter-name>
    <!--<filter-class>com.kuang.filter.GenericEncodingFilter</filter-class>-->
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <!--参数:CharacterEncodingFilter-->
    <init-param>
      <param-name>encoding</param-name>
      <param-value>utf-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

在编写完web.xml文件后,就该编写springmvc-servlet.xml文件了

<?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:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        https://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">

    <!--扫描指定包下的注解,让指定的类能够被IOC容器管理-->
    <context:component-scan base-package="com.westos.controller"/>

    <!--静态资源过滤-->
    <mvc:default-servlet-handler/>

    <!--annotation-driven:支持MVC注解驱动 -->
    <mvc:annotation-driven/>

    <!--
    视图解析器
    作用;方便统一管理
    -->
    <bean id="InternalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>


</beans>

在编写完springmvc-servlet.xml文件后,因为是web项目,我们就需要编写controller目录下的文件,但在此之前我们先需要在pojo目录下编写一个实体类User

package com.westos.pojo;

public class User {
    private String name;
    private int age;
    private String sex;

    public User() {
    }

    public User(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                '}';
    }
}

在编写完实体类后我们就可以进行UserController类的编写,在编写UserController类时,用到@ResponseBody注解,使用这个注解前需要导入依赖

<dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.8</version>
</dependency>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值