JSON学习

一、JSON

1.1 简介

JSON:JavaScript Object Notation是一种表示对象的方式

基于JavaScript语言的轻量级的数据交换格式;(即:用来传输数据的一种格式)

现在传输数据的方式更多是采用json的格式,渐渐代替了XML

1.2 JSON的数据表示

JSON采用名值对的方式来表示一个对象的信息

符号 描述 示例
{} 表示对象 {name : '书名1' , price:100}
[{},{},{}] 表示对象数组 [ {name : '书名1' , price:100} , {name : '书名2' , price:200} ]

注意:

  1. JSON的本质就是一串字符串,只不过元素(数据)会使用特定的符号标注

  2. 键和值之间用 : 隔开

  3. 键值对之间用 , 隔开

  4. 支持无限层嵌套

    ps:{name : 'Java从入门到精通' , price:100 , author:{name:'吴彦祖' , info:'从事java20年'}}

  5. '' 或 "" 都可以表示字符串

二、序列化和反序列化

序列化:指的是将Java对象转换为JSON字符串的过程,即 Java对象 → JSON字符串

反序列化:指的是将JSON字符串转换为Java对象的过程,即 JSON字符串 → Java对象

三、浏览器中处理JSON

3.1 JSON字符串 → 对象

使用parse函数解析JSON格式字符串

parse函数注意事项(坑):

  1. 字符串的数据格式:所有属性必须用双引号引住,因为使用JSON.parse需严格遵守JSON规范。
  2. 单引号与双引号 :使用单引号嵌套双引号的方式 ' {"name" : "Java从入门到精通" , "price":"100"} '

总结:

使用JSON.parse()来解析JSON字符串,需要注意的是被转化的字符串里面的属性要使用引号,并且总体是单引号套双引号的方式,太麻烦了。 如果使用eval() 就可以忽略上述两点需要注意的地方

javascript 复制代码
<script type="text/javascript">		
	//JSON字符串
    var jsonStr = '{"name" : "Java从入门到精通" , "price":"100"}';
	//JSON对象		
	var jsonObj = JSON.parse(jsonStr);//解析JSON字符串
	//获取数据	
	console.log(jsonObj.name);
	console.log(jsonObj.price);
</script>

使用eval函数解析JSON格式字符串

eval(str):将函数的参数作为JavaScript代码去执行

eval函数注意事项(坑):

​ 使用()包裹JSON字符串

​ "({name:'Java从入门到精通',price:100 , author:{name:'吴彦祖' , info:'从事java20年'}})"

原因:

​ eval本身的问题。 由于json是以"{}"的方式来开始以及结束的。在JavaScript中,它会被当成一个语句块来处理,所以必须强制性的将它转换成一种表达式。加上圆括号的目的是迫使eval函数在处理JavaScript代码的时候强制将括号内的表达式转化为对象,而不是作为代码来执行。

javascript 复制代码
<script type="text/javascript">
	//JSON字符串
	var jsonStr = 
        "({name:'Java从入门到精通',price:100,author:{name:'吴彦祖' , info:'从事java20年'}})";
	//解析成JSON对象
	var jsonObj = eval(jsonStr);
	//获取数据
	console.log(jsonObj.name);
	console.log(jsonObj.price);
	console.log(jsonObj.author.name);
	console.log(jsonObj.author.info);
</script>
javascript 复制代码
<script type="text/javascript">
	//JSON字符串
	var jsonStr1 = 
    "([{name:'Java从入门到精通',price:100,author:{name:'吴彦祖' , info:'从事java20年'}},		{name:'论演技的重要性',price:30,author:{name:'麻生希' , info:'从事电影事业13年'}}])";
	//解析成JSON对象数组
	var jsonObj = eval(jsonStr1);
	//遍历获取数据
	for(var i = 0;i<jsonObj.length;i++){
		console.log(jsonObj[i].name);
		console.log(jsonObj[i].price);
		console.log(jsonObj[i].author.name);
		console.log(jsonObj[i].author.info);
	}
</script>
3.2 对象 → JSON字符串
java 复制代码
<script type="text/javascript">	
	//对象
	var book = new Object();
	book.name = "Java从入门到精通";
	book.price = 100;
	
	//将对象转换为JSON字符串
	var jsonStr = JSON.stringify(book);
	
	//打印数据
	console.log(jsonStr);
</script>

四、Java中处理JSON

如果使用逻辑或Java原生解析类去解析JSON是非常麻烦的

项目中大多数会使用FastJSON和Jackson来操作JSON

五、FastJSON

5.1 简介

FastJson:阿里的开源框架,被不少企业使用,是一个极其优秀的Json框架,使用此框架必须在项目中导入框架包(fastjson-1.1.33.jar)

FastJson对于json格式字符串的解析主要用到了下面三个类:

  1. JSON:FastJSON的解析器,用于JSON格式字符串与JSON对象及javaBean之间的转换
  2. JSONObject:FastJSON提供的json对象
  3. JSONArray:FastJSON提供json数组对象
5.2 特点
  1. FastJson速度快,无论序列化和反序列化,都是当之无愧的fast
  2. 功能强大(支持普通JDK类包括任意Java Bean Class、Collection、Map、Date或enum)
  3. 零依赖(没有依赖其它任何类库)
5.3 对象 → JSON字符串
java 复制代码
public class FastJsonTest01 {
	@Test
	public void test01(){
		//对象->json对象
		Book book = new Book("Java从入门到精通",100);
		String jsonStr = JSON.tojsonStr(book);
		System.out.println(jsonStr);
	}
	@Test
	public void test02(){
		//对象->json对象(复杂版本)
		Book book = new Book("Java从入门到精通",100,new Author("吴彦祖","从事java20年"));
		String jsonStr = JSON.tojsonStr(book);
		System.out.println(jsonStr);
	}
	@Test
	public void test03(){
		//对象->json字符串(加过滤器)
		
		//匿名内部类
		PropertyFilter filter = new PropertyFilter(){
			public boolean apply(Object obj,String name,Object value){
				if(name.equalsIgnoreCase("price")){//忽略大小写比较
					return false;
				}
				return true;
			}
		};
		Book book = new Book("Java从入门到精通",100,new Author("吴彦祖","从事java20年"));
		String jsonStr=JSON.tojsonStr(book,filter);
		System.out.println(jsonStr);
	}
}
//书本类
public class Book {
	
	private String name;
	private double price;
	private Author author;
	
	public Book() {
	}

	public Book(String name, double price, Author author) {
		this.name = name;
		this.price = price;
		this.author = author;
	}

	public Book(String name, double price) {
		this.name = name;
		this.price = price;
	}

	public String getName() {
		return name;
	}

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

	public double getPrice() {
		return price;
	}

	public void setPrice(double price) {
		this.price = price;
	}

	public Author getAuthor() {
		return author;
	}

	public void setAuthor(Author author) {
		this.author = author;
	}

	@Override
	public String toString() {
		return "Book[name=" + name + ", price=" + price + ", author=" + author + "]";
	}
}
//作者类
public class Author {

	private String name;
	private String info;
	
	public Author() {
	}

	public Author(String name, String info) {
		this.name = name;
		this.info = info;
	}

	public String getName() {
		return name;
	}

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

	public String getInfo() {
		return info;
	}

	public void setInfo(String info) {
		this.info = info;
	}

	@Override
	public String toString() {
		return "Author [name=" + name + ", info=" + info + "]";
	}
}
5.4 JSON字符串 → 对象
java 复制代码
public class FastJsonTest02 {

	@Test
	public void test01(){
		//json字符串对象->对象
		String jsonStr = "{'name':'Java从入门到精通','price':100}";
		Book book = JSON.parseObject(jsonStr,Book.class);
		System.out.println(book);
	}
	
	@Test
	public void test02(){
		//复杂的json字符串->对象
		String jsonStr = "{'author':{'info':'从事java20年','name':'吴彦祖'},'name':'Java从入门到精通','price':100}";
		Book book = JSON. parseObject(jsonStr, Book . class);
		System. out . println(book);
	}
}
5.5 数组或集合 → JSON字符串
java 复制代码
public class FastJsonTest03 {
	
	Book book1 = new Book("Java从入门到精通", 100, new Author("吴彦祖","从事java20年"));
	Book book2 = new Book("论演技的重要性", 30, new Author("麻生希", "从事电影事业13年"));
	
	@Test
	public void test01(){
		//数组->json字符串
		Book[] books = {book1, book2};

		String jsonStr = JSON. tojsonStr(books);
		System.out.println(jsonStr);
	}
	
	@Test
	public void test02() {
		//List集合->json字符串
		
		ArrayList<Book> list = new ArrayList<Book>();
		list.add(book1);
		list.add(book2);

		String jsonStr = JSON.tojsonStr(list);
		System.out.println(jsonStr);
	}
	
	@Test
	public void test03() {
		//Map集合-〉json字符串
		HashMap<String, Book> map = new HashMap<String,Book>();
		map.put("001", book1);
		map.put("002", book2);

		String jsonStr = JSON.tojsonStr(map);
		System.out.println(jsonStr);

	}
}
5.6 JSON字符串 → 数组或集合
java 复制代码
public class FastJsonTest04 {	
	@Test
	public void test01(){
		//json字符串->数组
		String jsonStr = "[{'author':{'info':'从事java20年','name':'吴彦祖'},'name':'Java从入门到精通','price':100},{'author':{'info':'从事电影事业13年','name':'麻生希'},'name':'论演技的重要性','price':30}]";
		JSONArray parseArray = JSON.parseArray(jsonStr);
		
		for(int i = 0;i < parseArray.size();i++){	
			Book book = parseArray.getObject(i, Book.class);
			System.out.println(book);
		}
	}

	@Test
	public void test02(){
		//json字符串->List集合
		String jsonStr = "[{'author':{'info':'从事java20年','name':'吴彦祖'},'name':'Java从入门到精通','price':100},{'author':{'info':'从事电影事业13年','name':'麻生希'},'name':'论演技的重要性','price':30}]";

		List<Book> list = JSON.parseArray(jsonStr,Book.class);
		for(Book book : list){
			System.out.println(book);
		}
	}
	
	@Test
	public void test03(){
		//json字符串->Map集合
		String jsonStr = "{'001':{'author':{'info':'从事java20年', 'name': '何老师'},"
				+ "'name':'Java从入门到精通','price':100}, '002':{'author':{'info':'"
				+"从事电影事业13年','name' :'麻生希'},'name':'论演技的重要性','price' :30}}";
		
		@SuppressWarnings("unchecked")
		Map<String,JSONObject> map = (Map<String, JSONObject>) JSON.parse(jsonStr);
		
		Set<Entry<String, JSONObject>> entrySet = map.entrySet();
		for(Entry<String, JSONObject> entry : entrySet){
			String key=entry.getKey();
			Book value = JSON.toJavaObject(entry.getValue(), Book.class);
			System.out.println(key + "--" + value);
		}
	}
}

六、Jackson

6.1 简介

Jackson框架是基于Java平台的一套数据处理工具

解析JSON,依赖jackon的三个核心类库:

jackson-core-2.9.8.jar

​ jackson-annotations-2.9.8.jar

​ jackson-databind-2.9.8.jar

6.2 特点

使用注解,让JSON解析更加灵活

6.3 对象、集合 → JSON字符串
java 复制代码
public class Test01 {
	@Test
	public void test01() throws JsonProcessingException{
		//将对象转换为JSON字符串
		Book book = new Book("Java从入门到精通",100,new Author("吴彦祖","从事java20年"));
		
		//使用ObjectMapper来转化对象为JSON字符串
		ObjectMapper mapper = new ObjectMapper();
		// 配置mapper忽略空属性
		mapper.setSerializationInclusion(Include.NON_EMPTY);
		//将对象转换为JSON字符串
		String jsonStr = mapper.writeValueAsString(book);
		
		System.out.println(jsonStr);
	}
	
	@Test
	public void test02() throws JsonProcessingException{
		//将集合转换为JSON字符串
		Book book1 = new Book("Java从入门到精通",100,new Author("吴彦祖","从事java20年"));
		Book book2 = new Book("论演技的重要性", 30, new Author("麻生希", "从事电影事业13年"));
		List<Book> list = new ArrayList<>();
		list.add(book1);
		list.add(book2);
		
		//使用ObjectMapper来转化对象为JSON字符串
		ObjectMapper mapper = new ObjectMapper();
		// 配置mapper忽略空属性
		mapper.setSerializationInclusion(Include.NON_EMPTY);
		//将对象转换为JSON字符串
		String jsonStr = mapper.writeValueAsString(list);
		
		System.out.println(jsonStr);
	}
}
6.4 JSON字符串 → 对象、集合
java 复制代码
public class Test02 {
	@Test
	public void test01() throws IOException{
		//json字符串对象->对象
		String jsonStr = "{\"name\":\"Java从入门到精通\",\"price\":100.0,\"author\":{\"name\":\"吴彦祖\",\"info\":\"从事java20年\"}}";

		//ObjectMapper类用序列化与反序列化映射器
		ObjectMapper mapper = new ObjectMapper();

		//当反序列化JSON时,未知属性会引起的反序列化被打断,这里我们禁用未知属性打断反序列化功能,
		//例如:JSON字符串里有10个属性,而我们的bean中只定义了2个属性,其它8个属性将被忽略
		mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

		Book book = mapper.readValue(jsonStr, Book.class);
		System.out.println(book);
	}

	@Test
	public void test02() throws IOException{
		//json字符串->数组
		String jsonStr = "[{\"author\":{\"info\":\"从事java20年\",\"name\":\"吴彦祖\"},\"name\":\"Java从入门到精通\",\"price\":100},{\"author\":{\"info\":\"从事电影事业13年\",\"name\":\"麻生希\"},\"name\":\"论演技的重要性\",\"price\":30}]";

		//ObjectMapper类用序列化与反序列化映射器
		ObjectMapper mapper = new ObjectMapper();

		//当反序列化JSON时,未知属性会引起的反序列化被打断,这里我们禁用未知属性打断反序列化功能,
		//例如:JSON字符串里有10个属性,而我们的bean中只定义了2个属性,其它8个属性将被忽略
		mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

		List<Book> list = mapper.readValue(jsonStr, new TypeReference<List<Book>>() {});
		for (Book book : list) {
			System.out.println(book);
		}
	}
}
6.5 Jackson注解
java 复制代码
public class Test01 {
	@Test
	public void test01() throws JsonProcessingException{
		//将对象转换为JSON字符串
		
		Book book = new Book("Java从入门到精通",100,new Author("吴彦祖","从事java20年"));
		
		//ObjectMapper类用序列化与反序列化映射器
		ObjectMapper mapper = new ObjectMapper();
		// 配置mapper忽略空属性
		mapper.setSerializationInclusion(Include.NON_EMPTY);
		//将对象转换为JSON字符串
		String jsonStr = mapper.writeValueAsString(book);
		
		System.out.println(jsonStr);
	}
	
	@Test
	public void test02() throws IOException{
		//json字符串对象->对象
		String jsonStr = "{\"bookName\":\"Java从入门到精通\",\"price\":100.0,\"author\":{\"name\":\"吴彦祖\",\"info\":\"从事java20年\"}}";

		//ObjectMapper类用序列化与反序列化映射器
		ObjectMapper mapper = new ObjectMapper();

		//当反序列化JSON时,未知属性会引起的反序列化被打断,这里我们禁用未知属性打断反序列化功能,
		//例如:JSON字符串里有10个属性,而我们的bean中只定义了2个属性,其它8个属性将被忽略
		mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

		Book book = mapper.readValue(jsonStr, Book.class);
		System.out.println(book);
	}
}
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;

public class Book {
	
    
	@JsonProperty("bookName")//java属性name序列化到JSON字段的名称为bookName
	private String name;
	
	@JsonIgnore//在序列化与反序列化时,忽略price属性
	private double price;
	private Author author;
	
	@JsonCreator//指定JSON反序列化创建Book对象时调用此构造函数
	public Book() {
	}

	public Book(String name, double price,Author author) {
		System.out.println("aaa");
		this.name = name;
		this.price = price;
		this.author = author;
	}

	public Book(String name, double price) {
		this.name = name;
		this.price = price;
	}

	public String getName() {
		return name;
	}

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

	public double getPrice() {
		return price;
	}

	public void setPrice(double price) {
		this.price = price;
	}

	public Author getAuthor() {
		return author;
	}

	public void setAuthor(Author author) {
		this.author = author;
	}

	@Override
	public String toString() {
		return "Book[name=" + name + ", price=" + price + ", author=" + author + "]";
	}
}

七、总结

  1. JSON 格式:
    • {} - 对象
    • [{},{},{}] - 数组
  2. JSON可以支持无限层嵌套
  3. 序列化和反序列化
    • 序列化:指的是将对象转换为JSON字符串的过程,即 对象 → JSON字符串
    • 反序列化:指的是将JSON字符串转换为对象的过程,即 JSON字符串 → 对象
  4. 浏览器中处理JSON
    • parse():使用单引号嵌套双引号的方式
    • eval():使用()包裹JSON字符串
  5. Java中处理JSON:使用FastJSON和Jackson框架

八、作业

  1. 创建学生类(Student),属性有String name,int age,char sex,List interest
  2. 创建该类的对象
  3. 利用FastJSON解析成JSON字符串
  4. 利用Jackson解析成JSON字符串,学生属性中的name更改成username
相关推荐
耶啵奶膘14 分钟前
uniapp-是否删除
linux·前端·uni-app
魔道不误砍柴功43 分钟前
Java 中如何巧妙应用 Function 让方法复用性更强
java·开发语言·python
NiNg_1_23443 分钟前
SpringBoot整合SpringSecurity实现密码加密解密、登录认证退出功能
java·spring boot·后端
Nu11PointerException1 小时前
JAVA笔记 | ResponseBodyEmitter等异步流式接口快速学习
笔记·学习
闲晨1 小时前
C++ 继承:代码传承的魔法棒,开启奇幻编程之旅
java·c语言·开发语言·c++·经验分享
王哈哈^_^2 小时前
【数据集】【YOLO】【目标检测】交通事故识别数据集 8939 张,YOLO道路事故目标检测实战训练教程!
前端·人工智能·深度学习·yolo·目标检测·计算机视觉·pyqt
cs_dn_Jie2 小时前
钉钉 H5 微应用 手机端调试
前端·javascript·vue.js·vue·钉钉
测开小菜鸟2 小时前
使用python向钉钉群聊发送消息
java·python·钉钉
开心工作室_kaic3 小时前
ssm068海鲜自助餐厅系统+vue(论文+源码)_kaic
前端·javascript·vue.js
有梦想的刺儿3 小时前
webWorker基本用法
前端·javascript·vue.js