JSON 知识点
什么是 JSON ?
- JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
- JSON 是轻量级的文本数据交换格式
- JSON 独立于语言:JSON 使用 Javascript语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和
- JSON 库支持许多不同的编程语言。 目前非常多的动态(PHP,JSP,.NET)编程语言都支持JSON。
- JSON 具有自我描述性,更易理解
json语法
json语法规则
- 数据在名称/值对中
- 数据由逗号 , 分隔
- 使用斜杆来转义 \ 字符
- 大括号 {} 保存对象
- 中括号 [] 保存数组,数组可以包含多个对象
JSON 的两种结构
1.对象
大括号 {} 保存的对象是一个无序的名称/值对集合。一个对象以左括号 { 开始, 右括号 } 结束。每个"键"后跟一个冒号 :,名称/值对使用逗号 , 分隔
{key1 : value1, key2 : value2, ... keyN : valueN }
例:{ "name":"吨吨" , "age":18 }
2.数组:
中括号 [] 保存的数组是值(value)的有序集合。一个数组以左中括号 [ 开始, 右中括号 ] 结束,值之间使用逗号 , 分隔。
[
{ key1 : value1-1 , key2:value1-2 },
{ key1 : value2-1 , key2:value2-2 },
{ key1 : value3-1 , key2:value3-2 },
...
{ key1 : valueN-1 , key2:valueN-2 },
]
例:
"like":[
{ "name":"吨吨" , "age":18 },
{ "name":"好养活" , "age":18 }
]
JSON 值
数字(整数或浮点数)
字符串(在双引号中)
逻辑值(true 或 false)
数组(在中括号中)
对象(在大括号中)
null
JSON的转换
java对象和json之间相互转换三种方式
1.JackSon
maven依赖:(springboot中只要导入了spring-boot-starter-web会传递依赖,可以直接使用)
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.3</version>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.3</version>
</dependency>
GSon(谷歌)
maven依赖:
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.2</version>
</dependency>
3.fastjson
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version> 1.2.70</version>
</dependency>
JSON对象与java对象之间的相互转换
Java对象–>JSON对象
1.使用JackSON实现Java对象–>JSON对象
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonDemo {
public static void main(String[] args) throws ParseException, IOException {
User user = new User();
user.setName("小民");
user.setEmail("xiaomin@sina.com");
user.setAge(20);
SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd");
user.setBirthday(dateformat.parse("1996-10-01"));
/**
* ObjectMapper是JSON操作的核心,Jackson的所有JSON操作都是在ObjectMapper中实现。
* ObjectMapper有多个JSON序列化的方法,可以把JSON字符串保存File、OutputStream等不同的介质中。
* writeValue(File arg0, Object arg1)把arg1转成json序列,并保存到arg0文件中。
* writeValue(OutputStream arg0, Object arg1)把arg1转成json序列,并保存到arg0输出流中。
* writeValueAsBytes(Object arg0)把arg0转成json序列,并把结果输出成字节数组。
* writeValueAsString(Object arg0)把arg0转成json序列,并把结果输出成字符串。
*/
ObjectMapper mapper = new ObjectMapper();
//User类转JSON
//输出结果:{"name":"小民","age":20,"birthday":844099200000,"email":"xiaomin@sina.com"}
String json = mapper.writeValueAsString(user);
System.out.println(json);
//Java集合转JSON
//输出结果:[{"name":"小民","age":20,"birthday":844099200000,"email":"xiaomin@sina.com"}]
List<User> users = new ArrayList<User>();
users.add(user);
String jsonlist = mapper.writeValueAsString(users);
System.out.println(jsonlist);
}
}
1.使用GSon实现Java对象–>JSON对象
public static void main(String[] args) {
// Gson gson = new Gson();
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();
Student student = new Student(11, "zhangsan", new Date());
Student stu1 = new Student(12, "lisi", new Date());
Student stu2 = new Student(13, "wangwu", new Date());
Student stu3 = new Student(14, "weili", new Date());
//Java对象–>JSON对象
String jsonStr = gson.toJson(student, Student.class);
System.out.println(jsonStr );
}
3.使用fastjson实现Java对象–>JSON对象
public class JSONTest{
public static void main(String[] args) {
User user = new User("好养活", "男", 18);
//Java对象转化为JSON对象
JSONObject jsonObject = (JSONObject) JSONObject.toJSON(user);
System.out.println("Java对象转化为JSON对象\n" + jsonObject);//{"name":"好养活","age":18,"sex":"男"}
}
}
JSON对象–>Java对象
1.使用JackSon实现JSON对象–>Java对象
import java.io.IOException;
import java.text.ParseException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonDemo {
public static void main(String[] args) throws ParseException, IOException {
String json = "{\"name\":\"小民\",\"age\":20,\"birthday\":844099200000,\"email\":\"xiaomin@sina.com\"}";
/**
* ObjectMapper支持从byte[]、File、InputStream、字符串等数据的JSON反序列化。
*/
ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(json, User.class);
System.out.println(user);
}
}
2.使用GSon实现JSON对象–>Java对象
public static void main(String[] args) {
// Gson gson = new Gson();
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();
String jsonSrc = "{\"age\":11,\"name\":\"zhangsan\",\"bir\":\"2014-12-05 16:46:50\"}";
Student stu = gson.fromJson(jsonSrc, Student.class);
System.out.println(stu);
}
3.使用fastjson实现JSON对象–>Java对象
public class JSONTest{
public static void main(String[] args) {
User user1 = new User("好养活", "男", 18);
//先转成JSON对象
JSONObject jsonObject = (JSONObject) JSONObject.toJSON(user1);
//JSON对象转换成Java对象
User user = JSONObject.toJavaObject(jsonObject, User.class);
System.out.println("JSON对象转换成Java对象\n" + user);
//User{name='好养活', sex='男', age=18}
}
}
Java对象与JSON字符串之间的相互转换
Java对象–>JSON字符串
1.使用JackSon实现Java对象与JSON字符串之间的相互转换
package com.test;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class ObjectToJSON {
public static void main(String[] args) throws JsonProcessingException {
User student = new User("好养活", "男", 18);
//ObjectMapper:操作json的核心类
ObjectMapper mapper = new ObjectMapper();
//将java对象转换成json字符串
String Json = mapper.writeValueAsString(student);
System.out.println("使用jackson实现java对象转JSON字符串-->"+ Json);//使用jackson实现java对象转JSON字符串-->{"name":"好养活","sex":"男","age":18}
}
}
2、使用GSon实现Java对象与JSON字符串之间的相互转换
public static void main(String[] args) {
// Gson gson = new Gson();
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();
Student student = new Student(11, "zhangsan", new Date());
Student stu1 = new Student(12, "lisi", new Date());
Student stu2 = new Student(13, "wangwu", new Date());
Student stu3 = new Student(14, "weili", new Date());
String jsonStr = gson.toJson(student, Student.class);
System.out.println(jsonStr );
}
3.使用fastjson实现Java对象与JSON字符串之间的相互转换
public class JSONTest{
public static void main(String[] args) {
USer user = new User("好养活", "男", 18);
//Java对象转换成JSON字符串
String userStr = JSONObject.toJSONString(user);
System.out.println("Java对象转换成JSON字符串\n" + userStr);//{"age":18,"name":"好养活","sex":"男"}
}
}
JSON字符串–>Java对象
public class JSONTest{
public static void main(String[] args) {
String userStr = "{\"age\":18,\"name\":\"好养活\",\"sex\":\"男\"}";
//JSON字符串转换成Java对象
User user = JSONObject.parseObject(userStr, User.class);
System.out.println("JSON字符串转换成Java对象\n" + user);//user {name='好养活', sex='男', age=18}
}
}
JSON对象与JSON字符串之间的相互转换
JSON对象–>JSON字符串
.使用fastjson实现JSON对象–>JSON字符串
public class JSONTest{
public static void main(String[] args) {
User user = new User("好养活", "男", 18);
//先转成JSON对象
JSONObject jsonObject = (JSONObject) JSONObject.toJSON(user);
//JSON对象转换为JSON字符串
String jsonString = jsonObject.toJSONString();
System.out.println("JSON对象转换为JSON字符串\n" + jsonString);//{"name":"好养活","age":18,"sex":"男"}
}
}
JSON字符串–>JSON对象
1.使用fastjson实现JSON字符串–>JSON对象
public class JSONTest{
public static void main(String[] args) {
String userStr = "{\"age\":18,\"name\":\"张三\",\"sex\":\"男\"}";
//JSON字符串转换成JSON对象
JSONObject jsonObject1 = JSONObject.parseObject(userStr);
System.out.println("JSON字符串转换成JSON对象\n" + jsonObject1);//{"sex":"男","name":"张三","age":18}
}
}
json对象转map
1.使用JackSon实现json对象转map互转
2.使用Gson实现json对象转map互转
package com.test;
import com.google.gson.Gson;
import java.util.HashMap;
import java.util.Map;
public class JavaToJson {
public static void main(String[] args) {
Map<String, Object> resultMap = new HashMap<String, Object>();
resultMap.put("code",0);
resultMap.put("message","请求成功");
resultMap.put("data","数据信息");
//Gson
Gson gson = new Gson();
// Map转JSON
String s = gson.toJson(resultMap);
System.out.println("使用Gson进行map转JSON-->"+s);//使用Gson进行map转JSON-->{"code":0,"data":"数据信息","message":"请求成功"}
// 解析json,并指定解析对象类型
Map o = gson.fromJson(s, Map.class);
System.out.println("使用Gson进行Json转Map-->"+o);//使用Gson进行Json转Map-->{code=0.0, data=数据信息, message=请求成功}
}
}
3.使用JSONObject实现json对象转map互转
String s = JSON.toJSONString(resultMap);
// 解析json,并指定解析对象类型
Object o = JSON.parseObject(s, Object.class);
package com.test;
import com.alibaba.fastjson.JSONObject;
import com.sun.deploy.security.ruleset.RuleSetParser;
import java.util.Map;
public class JsonToMap {
public static void main(String[] args) {
String str = "{\"0\":\"zhangsan\",\"1\":\"lisi\",\"2\":\"wangwu\",\"3\":\"maliu\"}";
/**
* JSONObject是Map接口的一个实现类
*/
Map json = (Map) JSONObject.parse(str);
System.out.println("这个是用JSONObject类的parse方法来解析JSON字符串!!!");
for (Object map : json.entrySet()) {
System.out.println(((Map.Entry) map).getKey() + " " + ((Map.Entry) map).getValue());
}
/**
* JSONObject是Map接口的一个实现类
*/
JSONObject jsonObject = JSONObject.parseObject(str);
System.out.println("这个是用JSONObject的parseObject方法来解析JSON字符串!!!");
for (Object map : json.entrySet()) {
System.out.println(((Map.Entry) map).getKey() + " " + ((Map.Entry) map).getValue());
}
/**
* JSONObject是Map接口的一个实现类
*/
Map mapObj = JSONObject.parseObject(str, Map.class);
System.out.println("这个是用JSONObject的parseObject方法并执行返回类型来解析JSON字符串!!!");
for (Object map : json.entrySet()) {
System.out.println(((Map.Entry) map).getKey() + " " + ((Map.Entry) map).getValue());
}
System.out.println(json);
}
}
JSON 与List之间的相互转换
List 转JSON
1.使用jackson实现list转换为json
package com.test;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.ArrayList;
import java.util.List;
public class ListToJson {
public static void main(String[] args) throws JsonProcessingException {
List<User> list = new ArrayList<>();
list.add(new User("好养活1", "男", 18));
list.add(new User("好养活2", "男", 18));
list.add(new User("好养活3", "女", 18));
//使用JackSon实现List转JSON对象
ObjectMapper mapper = new ObjectMapper();
String studentList = mapper.writeValueAsString(list);
System.out.println("使用JackSon实现List转JSON对象-->"+studentList);//使用JackSon实现List转JSON对象-->[{"name":"好养活1","sex":"男","age":18},{"name":"好养活2","sex":"男","age":18},{"name":"好养活3","sex":"女","age":18}]
}
}
- 使用GSon实现list转换为json
//list转换为json
public static void main(String[] args) {
// Gson gson = new Gson();
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();
List<Student> list = new ArrayList<Student>();
list.add(student);
list.add(stu1);
list.add(stu2);
list.add(stu3);
String jsonListStr = gson.toJson(list);
System.out.println(jsonListStr);
}
- 使用fastJSON实现list转换为json
//list转换为json
List list = new ArrayList();
String str=JSON.toJSON(list).toString();
JSON 转List
- 使用Gson实现JSON–>List
public static void main(String[] args) {
// Gson gson = new Gson();
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();
list.add(student);
list.add(stu1);
list.add(stu2);
list.add(stu3);
String jsonListStr = gson.toJson(list);
System.out.println(jsonListStr);
List<Student> stuList = gson.fromJson(jsonListStr, new TypeToken<List<Student>>() {
}.getType());
System.out.println("========反序列化json数组==========");
System.out.println(stuList);
}
- 使用fastJson 实现json转换为list
//json转换为list
//jasonArray:json字符串
List list = new ArrayList();
list = JSONObject.parseArray(jasonArray, Person.class);
JSONArray与List之间的互相转换
List转JSONArray
- 使用 fastJSON实现List转JSONArray
//List转JSONArray
List list = new ArrayList<>();
JSONArray array= JSONArray.parseArray(JSON.toJSONString(list));
JSONArray转List
- 使用 fastJSON实现JSONArray转List
//JSONArray转List
JSONArray array = new JSONArray();
List list = JSONObject.parseArray(array.toJSONString(), User.class);