JSON:(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式,其采用完全独立于编程语言的文本格式来存储和表示数据,易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
JSON的语法:
对象表示为键值对
{"id":"1"}
{"name":"暮凌寒雪"}
{"age":"18"}
数据由逗号分隔
var json={a:"mlxh",b:"MLXH"}
花括号保存对象
{a:"mlxh",b:"MLXH"}
方括号保存数组
[1,2,{age:"18"},3,{name:"MLXH"}]
JSON和JS的区别
JSON 和 Js 对象的关系:
JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。
JS对象:
var obj = {a: 'Hello', b: 'World'}; //注意键名也是可以使用引号包裹的
JSON字符串
var json = '{"a": "Hello", "b": "World"}';
JSON和JS的相互转换
- JSON字符串转换为JS对象,使用 JSON.parse() 方法:
var obj = JSON.parse('{"a": "Hello", "b": "World"}');
//结果是 {"a": "Hello", "b": "World"}
- 从JS对象转换为JSON字符串,使用 JSON.stringify() 方法:
var json = JSON.stringify({a: 'Hello', b: 'World'});
//结果是 '{"a": "Hello", "b": "World"}'
从后台传递JSON数据
导个包:
json解析工具:
- Jackson
- fastjson
这里我们使用Jackson
<!--https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
对象的实体类
package com.MLXH.controller;
public class User {
private int id ;
private String name;
private int age;
public User() {
}
public User(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
接着写controller
package com.MLXH.controller;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class jsonController {
@RequestMapping("/json")
@ResponseBody
public String jsonDemo() throws JsonProcessingException {
//创建一个jackson的对象映射器,用来解析数据
ObjectMapper mapper = new ObjectMapper();
//创建一个对象
User user = new User(1, "暮凌寒雪", 18);
//将我们的对象解析成为json格式
String str = mapper.writeValueAsString(user);
return str; //由于@ResponseBody注解,这里会将str转成json格式返回;十分方便
}
}
注解解释:
- @Controller: 将这个类交给Spring 来进行托管(具体可以看之前的一篇博客,SpringMVC的原理);
- @RequestMapping("/json"):设定页面的访问地址;
- @ResponseBody:将返回值变为一个JSON数据返回前端页面;
然后配SpringMVC的配置文件
Spring配置文件的三要素别忘了:自动扫描包,适配器解析器,视图解析器
表头是最难写的,没必要去死记硬背,这篇博客有我整理的各种配置文件的表头…有需要直接copy…Java中各种配置文件的表头代码集合
代码如下:
<?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">
<!--自动扫描包-->
<context:component-scan base-package="想要扫描的包名路径"/>
<!--适配器解析器-->
<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>
看一下结果:
可以看到我们的姓名这块出现了???
接下来我们解决一下字符乱码问题
乱码问题解决方式1
需要设置一下他的编码格式为utf-8,以及它返回的类型;
可以通过@RequestMaping的produces属性来实现,修改下代码
@RequestMapping(value = "/json",produces = "application/json;charset=utf-8")
再试一下:
这种方式呢,只能解决当前页面的,若想要项目中没个页面的JSON格式都没有乱码,就要使用到下面的方式:
乱码问题解决方式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乱码问题的…
JSON时间日期返回问题
注意的点:若是在后台创建的Date对象将其转换为JSON格式输出到前端页面,Jackson 默认是转成timestamps形式,会变成一个数字,是1970年1月1日到当前日期的毫秒数!
那如何使它返回的json字符串是一个常见的日期格式呢,这就需要在后台进行设置:
@RequestMapping("/time")
@ResponseBody
public String json2() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
//不使用时间差的方式
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
//自定义日期格式对象
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//指定日期格式
mapper.setDateFormat(sdf);
Date date = new Date();
String str = mapper.writeValueAsString(date);
return str; //由于@ResponseBody注解,这里会将str转成json格式返回;十分方便
}
结果:ok了~