JSON介绍
1…基本介绍
JSON (Javascript Object Notation 声明)
是一种轻量级的数据交换格式。
1)数据交换
将数据转换成一种与平台无关的数据格式然后发送给接收方来处理。
2)轻量级
JSON相对于xml,文档更小,解析速度更快。
语法
注:JSON借鉴了javascript的一些语法。
1)表示一个对象
{属性名:属性值,属性名:属性值…}
注意:
a.属性名必须使用双引号括起来。
b.属性值可以是string,number,null,true/false,object。
c.属性值如果是string,必须使用双引号括起来。
2)表示对象组成的数组[{},{},{}…]
如何将java对象转换成JSON字符串。
使用jackson提供的api(ObjectMapper提供的方法)
1.1json表示一个对象(代码演示)
public class TestJson {
public static void main(String[] args) throws JsonProcessingException {
User user=new User(1,"admin","521125",56933,42);
//使用jackJson提供的API来将user对象转换为json字符串格式
ObjectMapper om=new ObjectMapper();
//将传入的对象序列化为json,返回json字符串
String jsonstr=om.writeValueAsString(user);
System.out.println(jsonstr);
}
}
2.2json表示对象组成的数组
public class TestJson {
public static void main(String[] args) throws JsonProcessingException {
List<User> list=new ArrayList<User>();
for(int i=0;i<5;i++){
User user=new User(1+i,"admin"+i,"0000"+i,10000+i,42+i);
list.add(user);
}
System.out.println(list);
//将list集合转换成json格式
ObjectMapper om=new ObjectMapper();
String jsonstr=om.writeValueAsString(list);
System.out.println(jsonstr);
}
}
2.JSON应用于Spring框架
2.1导入json所需的jar包
<!--JSON需要导入以下jar包-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.9</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.9</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.9.3</version>
</dependency>
2.2自定义json返回对象的类
json返回的对象一般包括以下三个信息:
1.数据
2.返回的信息
3.状态
package fyjz.com.json.web;
import java.io.Serializable;
public class JsonResult<T> implements Serializable{
private T date;//正常数据
private String message;//返回信息(正确/错误)
private int state;
private static final int ERROR=0;//错误状态
private static final int SUCCESS=1;//正确状态
//获取正常信息
public JsonResult(T date) {
this.date=date;
this.state=SUCCESS;
this.message="ok";
}
//获取异常信息
public JsonResult(Throwable e) {
this.state=ERROR;
this.message=e.getMessage();
}
public JsonResult() {
this.state=SUCCESS;
this.message="ok";
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
public T getDate() {
return date;
}
public void setDate(T date) {
this.date = date;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
@Override
public String toString() {
return "JsonResult [date=" + date + ", message=" + message + ", state=" + state + "]";
}
}
2.3控制层处理数据
@ResponseBody:说明
1.数据以json形式返回给前端,使用在控制层上的方法, 将方法的返回值以特定的格式写到response的body区域,进而将数据返回给前端;
2.当不写@ResponseBody时,底层会将方法的返回值封装为ModelView对象。
3.写@ResponseBody其一:阻止跳转页面,其二:将数据以json格式返回给前端页面
* 注意编码问题:
* 如果返回json字符串格式需要将原来的iso-8859-1字符集改为utf-8,
* 如果返回的是json对象则不需要改变字符集。
1.以json格式返回json字符串
@RequestMapping(value="demo.do",produces="text/html;charset=utf-8")
@ResponseBody
public String test01() throws JsonProcessingException{
User user=new User(1, "超超", "521125", 520, 20);
ObjectMapper om=new ObjectMapper();
String json=om.writeValueAsString(user);
return json;
}
2.以json格式返回json对象
@RequestMapping("demo2.do")
@ResponseBody
public User demo2(){
User u=new User(1,"超个","20212",2185,5551);
return u;
}
3.以json格式返回集合对象
@RequestMapping("demo3.do")
@ResponseBody
public List<User> demo3(){
List<User> list=new ArrayList<User>();
for(int i=0;i<5;i++){
User user=new User(1+i,"admin"+i,"0000"+i,10000+i,42+i);
list.add(user);
}
return list;
}
4.对返回json格式的数据进行优化(有参)
@RequestMapping("demo4.do")
@ResponseBody
public JsonResult<User> demo04(){
User u=new User(1,"超个","20212",2185,5551);
return new JsonResult<User>(u);
}
5:无参
@RequestMapping("demo5.do")
@ResponseBody
public JsonResult<Void> demo05(){
return new JsonResult<Void>();
}
调用了类的无参构造方法
6.list集合
@RequestMapping("demo6.do")
@ResponseBody
public JsonResult<List<User>> demo6(){
List<User> list=new ArrayList<User>();
for(int i=0;i<5;i++){
User user=new User(1+i,"admin"+i,"0000"+i,10000+i,42+i);
list.add(user);
}
return new JsonResult<List<User>>(list);
}
7.List<Map<String,Object>>
@RequestMapping("demo7.do")
@ResponseBody
public JsonResult<List<Map<String,Object>>> demo7(){
List<Map<String,Object>> list=new ArrayList<Map<String,Object>>();
for(int i=0;i<5;i++){
Map<String,Object> map=new HashMap<String, Object>();
map.put("name","超超"+i);
map.put("age","18"+i);
list.add(map);
}
return new JsonResult<List<Map<String,Object>>>(list);
}
8.程序异常 如果返回返回类型是基本类型,则必须转换成包装类型
@RequestMapping("demo8.do")
@ResponseBody
public JsonResult<Integer> demo08(){
int a=8;
if(a==8){
throw new RuntimeException("错了");
}
return new JsonResult<Integer>();
}
//捕获异常
@ExceptionHandler
@ResponseBody
public JsonResult<Object> handler(Exception e){
return new JsonResult<Object>(e);
}
调用处理异常的构造方法