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
相关推荐
蜡笔小新星6 分钟前
Flask项目框架
开发语言·前端·经验分享·后端·python·学习·flask
cliff,7 分钟前
【python爬虫】酷狗音乐爬取
笔记·爬虫·python·学习
夏天的味道٥3 小时前
使用 Java 执行 SQL 语句和存储过程
java·开发语言·sql
Fantasywt4 小时前
THREEJS 片元着色器实现更自然的呼吸灯效果
前端·javascript·着色器
云上艺旅4 小时前
K8S学习之基础十八:k8s的灰度发布和金丝雀部署
学习·云原生·容器·kubernetes
IT、木易4 小时前
大白话JavaScript实现一个函数,将字符串中的每个单词首字母大写。
开发语言·前端·javascript·ecmascript
冰糖码奇朵5 小时前
大数据表高效导入导出解决方案,mysql数据库LOAD DATA命令和INTO OUTFILE命令详解
java·数据库·sql·mysql
好教员好5 小时前
【Spring】整合【SpringMVC】
java·spring
浪九天6 小时前
Java直通车系列13【Spring MVC】(Spring MVC常用注解)
java·后端·spring
堕落年代6 小时前
Maven匹配机制和仓库库设置
java·maven