JSON
概念
JSON:JavaScript Object Notation是一种表示对象的方式
基于JavaScript语言的轻量级的数据交换格式;(即:用来传输数据的一种格式)
现在传输数据的方式更多是采用json的格式,渐渐代替了XML
JSON的数据表示
JSON采用名值对的方式来表示一个对象的信息
符号 描述 示例 {} 表示对象 {name : '书名1' , price:100} [{},{},{}] 表示对象数组 [ {name : '书名1' , price:100} , {name : '书名2' , price:200} ] 注意:
JSON的本质就是一串字符串,只不过元素(数据)会使用特定的符号标注
键和值之间用 : 隔开
键值对之间用 , 隔开
支持无限层嵌套
ps:{name : 'Java从入门到精通' , price:100 , author:{name:'奇男子' , info:'从事java20年'}}
5. '' 或 "" 都可以表示字符串
序列化和反序列化
序列化:指的是将Java对象转换为JSON字符串的过程,即 Java对象 → JSON字符串
反序列化:指的是将JSON字符串转换为Java对象的过程,即 JSON字符串 → Java对象
处理JSON
1.浏览器中处理JSON
json字符串→ js对象
法1:parse()
注意:使用parse解析json格式的字符串,该字符串必须使用单引号包裹着双引号
jsp
<script type="text/javascript">
//json格式的字符串
var jsonStr = '{"name":"Java从入门到精通","price":100}';
//将json格式的字符串转换为js对象
var jsObj = JSON.parse(jsonStr);
alert(jsObj.name + " -- " + jsObj.price);
</script>
法2:eval()
注意:eval去解析json格式的字符串,必须使用小括号括起来
jsp
<script type="text/javascript">
//json格式的字符串
var jsonStr = "({'name':'Java从入门到精通','price':100})";
//将json格式的字符串转换为js对象
var jsObj = eval(jsonStr);
alert(jsObj.name + " -- " + jsObj.price);
</script>
json字符串→ js数组
法2:eval()
注意:json格式字符串转数组,不用使用小括号,因为JS中数组使用中括号,eval能够识别到中括号是数组
jsp
<script type="text/javascript">
//json格式的字符串
var jsonStr = "[{'name':'Java从入门到精通','price':100},{'name':'MySQL从删库到跑路','price':200}]";
//将json格式的字符串转换为js数组
var jsArr = eval(jsonStr);
for(var i = 0;i<jsArr.length;i++){
var jsObj = jsArr[i];
alert(jsObj.name + " -- " + jsObj.price);
}
</script>
js对象、js数组→ json字符串
stringify()
jsp
<script type="text/javascript">
//js对象
var book = new Object();
book.name = "Java从入门到精通";
book.price = 100;
//将js对象转json格式的字符串
var jsonStr = JSON.stringify(book);
alert(jsonStr);
</script>
jsp
<script type="text/javascript">
//js对象
var book1 = new Object();
book1.name = "Java从入门到精通";
book1.price = 100;
var book2 = new Object();
book2.name = "MySQL从删库到跑路";
book2.price = 200;
//js数组
var jsArr = [book1,book2];
//将js数组转json格式的字符串
var jsonStr = JSON.stringify(jsArr);
alert(jsonStr);
</script>
2.Java中处理JSON
如果使用逻辑或Java原生解析类去解析JSON是非常麻烦的
项目中大多数会使用FastJSON和Jackson来操作JSON
FastJSON
概念
FastJson:阿里的开源框架,被不少企业使用,是一个极其优秀的Json框架,使用此框架必须在项目中导入框架包(fastjson-1.1.33.jar)
FastJson对于json格式字符串的解析主要用到了下面三个类:
- JSON:FastJSON的解析器,用于JSON格式字符串与JSON对象及javaBean之间的转换
- JSONObject:FastJSON提供的json对象
- JSONArray:FastJSON提供json数组对象
特点
- FastJson速度快,无论序列化和反序列化,都是当之无愧的fast
- 功能强大(支持普通JDK类包括任意Java Bean Class、Collection、Map、Date或enum)
- 零依赖(没有依赖其它任何类库)
导jar包
java对象→ json字符串
toJSONString()
java
@Test
public void test01(){
//Java对象
Book book = new Book("Java从入门到精通", 100, new Author("奇男子", "从事Java开发20年"));
//Java对象转JSON格式的字符串
String jsonStr = JSON.toJSONString(book);
//{"author":{"info":"从事Java开发20年","name":"奇男子"},"name":"Java从入门到精通","price":100}
System.out.println(jsonStr);
}
输出:{"author":{"info":"从事Java20年","name":"奇男子"},"name":"Java从入门到精通","price":100}
+过滤器toJSONString( book, new PropertyFilter());
java
@Test
public void test02(){
//Java对象
Book book = new Book("Java从入门到精通", 100, new Author("奇男子", "从事Java开发20年"));
//Java对象转JSON格式的字符串 -- 过滤author对象里的name属性
//思考题:研究toJSONString的底层逻辑
String jsonStr = JSON.toJSONString(book, new PropertyFilter() {
@Override
public boolean apply(Object o, String s, Object o1) {
if(o.getClass() == Author.class && s.equals("name")){
return false;
}
return true;
}
});
System.out.println(jsonStr);
}
输出:{"author":{"info":"从事Java20年"},"name":"Java从入门到精通","price":100}
json字符串→ java对象
parseObject(jsonStr, Book.class)
java
@Test
public void test01(){
//JSON格式的字符串
String jsonStr = "{\"author\":{\"info\":\"从事Java开发20年\",\"name\":\"奇男子\"},\"name\":\"Java从入门到精通\",\"price\":100}";
Book book = JSON.parseObject(jsonStr, Book.class);
System.out.println(book);
}
输出:Book{name='Java从入门到精通', price=100.0, author=Author{name='奇男子', info='从事Java开发20年'}}
java数组、集合→ json字符串
注意:在相互转换过程中需要注意数据的格式
将java数组 转换为 json格式的字符串
JSON.toJSONString(books)
将Collection集合 转换为 json格式的字符串
JSON.toJSONString(list);
将Map集合 转换为json格式的字符串
JSON.toJSONString(map);
java
public class Test03 {
@Test
public void test01(){
//将java数组 转换为 json格式的字符串
//数组
Book book1 = new Book("Java从入门到精通", 100, new Author("奇男子", "从事Java开发20年"));
Book book2 = new Book("MySQL从删库到跑路", 200, new Author("小小", "专业删库跑路"));
Book[] books = {book1,book2};
//将java数组 转换为 json格式的字符串
String jsonStr = JSON.toJSONString(books);
//[{"author":{"info":"从事Java开发20年","name":"奇男子"},"name":"Java从入门到精通","price":100},{"author":{"info":"专业删库跑路","name":"小小"},"name":"MySQL从删库到跑路","price":200}]
System.out.println(jsonStr);
}
@Test
public void test02(){
//将Collection集合 转换为 json格式的字符串
//Collection集合
Book book1 = new Book("Java从入门到精通", 100, new Author("奇男子", "从事Java开发20年"));
Book book2 = new Book("MySQL从删库到跑路", 200, new Author("小小", "专业删库跑路"));
List<Book> list = Arrays.asList(book1, book2);
//将Collection集合 转换为 json格式的字符串
String jsonStr = JSON.toJSONString(list);
//[{"author":{"info":"从事Java开发20年","name":"奇男子"},"name":"Java从入门到精通","price":100},{"author":{"info":"专业删库跑路","name":"小小"},"name":"MySQL从删库到跑路","price":200}]
System.out.println(jsonStr);
}
@Test
public void test03(){
//将Map集合 转换为json格式的字符串
//Map集合
Book book1 = new Book("Java从入门到精通", 100, new Author("奇男子", "从事Java开发20年"));
Book book2 = new Book("MySQL从删库到跑路", 200, new Author("小小", "专业删库跑路"));
HashMap<String, Book> map = new HashMap<>();
map.put("001",book1);
map.put("002",book2);
//将Map集合 转换为json格式的字符串
String jsonStr = JSON.toJSONString(map);
//{"001":{"author":{"info":"从事Java开发20年","name":"奇男子"},"name":"Java从入门到精通","price":100},"002":{"author":{"info":"专业删库跑路","name":"小小"},"name":"MySQL从删库到跑路","price":200}}
System.out.println(jsonStr);
}
}
json字符串→ java数组、集合
将json格式的字符串 转换为 java数组
1.将json格式的字符串转换为JSONArray对象
JSONArray.parseArray(jsonStr);
2.获取指定类型的对象遍历存入数组
jsonArray.getObject(i, Book.class);
将json格式的字符串 转换为 Collection集合
JSONArray.parseArray(jsonStr, Book.class);
将json格式的字符串 转换为 Map集合
Map<String,Book> map = (Map<String, Book>) JSONArray.parse(jsonStr);
java
public class Test04 {
@Test
public void test01(){
//将json格式的字符串 转换为 java数组
//json格式的字符串
String jsonStr = "[{\"author\":{\"info\":\"从事Java开发20年\",\"name\":\"奇男子\"},\"name\":\"Java从入门到精通\",\"price\":100},{\"author\":{\"info\":\"专业删库跑路\",\"name\":\"小小\"},\"name\":\"MySQL从删库到跑路\",\"price\":200}]";
//将json格式的字符串转换为JSONArray对象
JSONArray jsonArray = JSONArray.parseArray(jsonStr);
Book[] books = new Book[jsonArray.size()];
for (int i = 0;i<jsonArray.size();i++){
Book book = jsonArray.getObject(i, Book.class);
books[i] = book;
}
for (Book book : books) {
System.out.println(book);
}
}
@Test
public void test02(){
//将json格式的字符串 转换为 Collection集合
//json格式的字符串
String jsonStr = "[{\"author\":{\"info\":\"从事Java开发20年\",\"name\":\"奇男子\"},\"name\":\"Java从入门到精通\",\"price\":100},{\"author\":{\"info\":\"专业删库跑路\",\"name\":\"小小\"},\"name\":\"MySQL从删库到跑路\",\"price\":200}]";
//将json格式的字符串 转换为 Collection集合
List<Book> books = JSONArray.parseArray(jsonStr, Book.class);
for (Book book : books) {
System.out.println(book);
}
}
@Test
public void test03(){
//将json格式的字符串 转换为 Map集合
//json格式的字符串
String jsonStr = "{\"001\":{\"author\":{\"info\":\"从事Java开发20年\",\"name\":\"奇男子\"},\"name\":\"Java从入门到精通\",\"price\":100},\"002\":{\"author\":{\"info\":\"专业删库跑路\",\"name\":\"小小\"},\"name\":\"MySQL从删库到跑路\",\"price\":200}}";
//将json格式的字符串 转换为 Map集合
Map<String,Book> map = (Map<String, Book>) JSONArray.parse(jsonStr);
Set<Map.Entry<String, Book>> entries = map.entrySet();
for (Map.Entry<String, Book> entry : entries) {
System.out.println(entry);
}
}
}
Jackson
概念
Jackson框架是基于Java平台的一套数据处理工具
解析JSON,依赖jackon的三个核心类库:
jackson-core-2.9.8.jar
jackson-annotations-2.9.8.jar
jackson-databind-2.9.8.jar
特点
使用注解,让JSON解析更加灵活
java对象、集合 → 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);
}
}
JSON字符串 → java对象、集合
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 mapper = new ObjectMapper();
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);
}
}
}
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 mapper = new ObjectMapper();
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("xxx");//测试是否调用输出
this.name = name;
this.price = price;
this.author = author;
}
public Book(String name, double price) {
this.name = name;
this.price = price;
}
...
}
补充:Java中的bean
概念:
Java中的bean是一种遵循特定约定的类,用于数据传输、持久化、业务逻辑和视图模型等。
特点:
- 无状态:bean通常不依赖于外部状态,这使得它们可以在多个线程或请求中重复使用。
- 可序列化:bean可以轻松地保存和加载,这对于数据持久化和网络传输非常有用。
- 遵守JavaBean规范:包括属性、方法和事件的规范,这些规范使得bean易于理解和使用。
优点:
它们提供了代码的可复用性、易于维护和跨平台兼容性的优点。
应用场景:
Java中的bean主要用于数据传输、持久化、业务逻辑和视图模型等方面。它们提供了一种方式来封装和复用代码,使得开发人员可以更容易地构建和维护应用程序。