一、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} ] 注意:
JSON的本质就是一串字符串,只不过元素(数据)会使用特定的符号标注
键和值之间用 : 隔开
键值对之间用 , 隔开
支持无限层嵌套
ps:{name : 'Java从入门到精通' , price:100 , author:{name:'吴彦祖' , info:'从事java20年'}}
'' 或 "" 都可以表示字符串
二、序列化和反序列化
序列化:指的是将Java对象转换为JSON字符串的过程,即 Java对象 → JSON字符串
反序列化:指的是将JSON字符串转换为Java对象的过程,即 JSON字符串 → Java对象
三、浏览器中处理JSON
3.1 JSON字符串 → 对象
使用parse函数解析JSON格式字符串
parse函数注意事项(坑):
- 字符串的数据格式:所有属性必须用双引号引住,因为使用JSON.parse需严格遵守JSON规范。
- 单引号与双引号 :使用单引号嵌套双引号的方式 ' {"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格式字符串的解析主要用到了下面三个类:
- JSON:FastJSON的解析器,用于JSON格式字符串与JSON对象及javaBean之间的转换
- JSONObject:FastJSON提供的json对象
- JSONArray:FastJSON提供json数组对象
5.2 特点
- FastJson速度快,无论序列化和反序列化,都是当之无愧的fast
- 功能强大(支持普通JDK类包括任意Java Bean Class、Collection、Map、Date或enum)
- 零依赖(没有依赖其它任何类库)
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 + "]";
}
}
七、总结
- JSON 格式:
- {} - 对象
- [{},{},{}] - 数组
- JSON可以支持无限层嵌套
- 序列化和反序列化
- 序列化:指的是将对象转换为JSON字符串的过程,即 对象 → JSON字符串
- 反序列化:指的是将JSON字符串转换为对象的过程,即 JSON字符串 → 对象
- 浏览器中处理JSON
- parse():使用单引号嵌套双引号的方式
- eval():使用()包裹JSON字符串
- Java中处理JSON:使用FastJSON和Jackson框架
八、作业
- 创建学生类(Student),属性有String name,int age,char sex,List interest
- 创建该类的对象
- 利用FastJSON解析成JSON字符串
- 利用Jackson解析成JSON字符串,学生属性中的name更改成username