JSON概念

  • JavaScript Object Natation,JS对象表示法
  • 是一种轻量级的数据交换格式
  • 类似于XML,更小,快,更易于解析
  • 最早用于Javascript中,容易解析,最后推广到全语言
  • 使用Javascript语法,但是独立于编程语言

JSON

JSON中有俩个定义

JSONObject

  • 名称/值对,一个K-V对
    – JSON对象:{“name”:“shen”,“number”:“123123”}
    – 数据在键值对中
    – 数据由逗号分隔
    – 花括号保存对象
    JSONArray,JSON数组
  • 方括号来保存数组
•  [{“name”:“shen”,“number”:“123123”} , {“name”:“wu”,“number”:“123321”}]

Java的JSON处理(第三方库)

  • org.json:JSON官方推荐的解析类
    – 简单易用,通用性强
    – 复杂功能欠缺
  • GSON,Google出品
    – 基于反射,可以实现JSON对象、JSON字符串、Java对象互转
  • Jackson:号称最快的JSON处理器
    – 简单易用,更新较快

JSON生成
JSON解析
JSON校验
和Java Bean对象进行互解析

  • 具有一个无参的构造函数
  • 可以包括对个属性,所有属性都是private
  • 每个属性都有相应的Getter/Setter方法
  • Java Bean用于封装数据,又可称为POJO(Plain Old Java Object)

org.json

import org.json.JSONArray;
import org.json.JSONObject;

import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 采用org.json包来解析JSON
 * @author Tom
 *
 */

public class OrgJsonTest {
	public static void main(String[] args) {
		testJsonObject();
		System.out.println("=========华丽丽的分割线==============");
		testJsonFile();
	}
    public static void testJsonObject() {
    	//构造对象
    	Person p = new Person();
    	p.setName("Tom");
    	p.setAge(20);
    	p.setScores(Arrays.asList(60,70,80));
    	
    	
    	//构造JSONObject对象
    	JSONObject obj = new JSONObject(); 	
    	
        //string
    	obj.put("name", p.getName());
        //int
    	obj.put("age", p.getAge());
        //array
        obj.put("scores", p.getScores());
        //null
        //object.put("null", null);
        System.out.println(obj);        
        
        System.out.println("name: " + obj.getString("name"));
        System.out.println("age: " + obj.getInt("age"));
        System.out.println("scores: " + obj.getJSONArray("scores"));
    }

    public static void testJsonFile() {
    	File file = new File("books.json");
        try (FileReader reader = new FileReader(file)) {
        	//读取文件内容到JsonObject对象中
            int fileLen = (int) file.length();
            char[] chars = new char[fileLen];
            reader.read(chars);
            String s = String.valueOf(chars);
            JSONObject jsonObject = new JSONObject(s);
            
            //开始解析JSONObject对象
            JSONArray books = jsonObject.getJSONArray("books");
            List<Book> bookList = new ArrayList<>();
            for (Object book : books) {
            	//获取单个JSONObject对象
                JSONObject bookObject = (JSONObject) book;
                Book book1 = new Book();
                book1.setAuthor(bookObject.getString("author"));
                book1.setYear(bookObject.getString("year"));
                book1.setTitle(bookObject.getString("title"));
                book1.setPrice(bookObject.getInt("price"));
                book1.setCategory(bookObject.getString("category"));
                bookList.add(book1);
            }
            
            for(Book book:bookList)
            {
            	System.out.println(book.getAuthor() + ",  " + book.getTitle());
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

//输出
{"scores":[60,70,80],"name":"Tom","age":20}
name: Tom
age: 20
scores: [60,70,80]
=========华丽丽的分割线==============
Giada De Laurentiis,  Everyday Italian
J K. Rowling,  Harry Potter
Erik T. Ray,  Learning XML

GSON
里面的JsonObject类和上面包中JSONObject类 名字不一样

import java.io.File;
import java.io.FileReader;
import java.util.Arrays;
import java.util.List;

import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.reflect.TypeToken;

/**
 * 采用Google GSON来处理JSON
 * @author Tom
 *
 */
public class GsonTest {
	public static void main(String[] args) {
		testJsonObject();
		System.out.println("=========华丽丽的分割线==============");
		testJsonFile();
	}
	public static void testJsonObject() {
		//构造对象
    	Person p = new Person();
    	p.setName("Tom");
    	p.setAge(20);
    	p.setScores(Arrays.asList(60,70,80));
		
    	//从Java对象到JSON字符串
		Gson gson = new Gson();
		String s = gson.toJson(p);
		System.out.println(s); //{"name":"Tom","age":20,"scores":[60,70,80]}
		
		//从JSON字符串到Java对象
		Person p2 = gson.fromJson(s, Person.class);
		System.out.println(p2.getName());  //Tom
		System.out.println(p2.getAge());   //20
		System.out.println(p2.getScores());//[60, 70, 80]
		
		//调用GSON的JsonObject
		JsonObject json = gson.toJsonTree(p).getAsJsonObject(); //将整个json解析为一颗树
		System.out.println(json.get("name"));  //"Tom"
		System.out.println(json.get("age"));   //20
		System.out.println(json.get("scores"));//[60,70,80]
		
	}
	
	public static void testJsonFile() {
		Gson gson = new Gson();
		File file = new File("books2.json");
		
        try (FileReader reader = new FileReader(file)) {
           //直接将json文件对象返回为JAVA对象数组
        	List<Book> books = gson.fromJson(reader, new TypeToken<List<Book>>(){}.getType());
            
        	for(Book book : books)
        	{
        		System.out.println(book.getAuthor() + ",  " + book.getTitle());
        	}
        } catch (Exception e) {
            e.printStackTrace();
        }
	}
}

//输出

{"name":"Tom","age":20,"scores":[60,70,80]}
Tom
20
[60, 70, 80]
"Tom"
20
[60,70,80]
=========华丽丽的分割线==============
Giada De Laurentiis,  Everyday Italian
J K. Rowling,  Harry Potter
Erik T. Ray,  Learning XML

Jackson
里面JsonObjec对象 类名为JsonNode

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.reflect.TypeToken;

/**
 * 采用Jackson来处理JSON
 * @author Tom
 *
 */

public class JacksonTest {

	public static void main(String[] args) throws Exception {
		testJsonObject();
		System.out.println("=========华丽丽的分割线==============");
		testJsonFile();
	}
	
	static void testJsonObject() throws IOException {
		ObjectMapper om = new ObjectMapper();
		
		//构造对象
    	Person p = new Person();
    	p.setName("Tom");
    	p.setAge(20);
    	p.setScores(Arrays.asList(60,70,80));
    	
    	//将对象解析为json字符串
		String jsonStr = om.writeValueAsString(p);
		System.out.println(jsonStr);
		
		//从json字符串重构对象
		Person p2 = om.readValue(jsonStr, Person.class);
		System.out.println(p2.getName());
		System.out.println(p2.getAge());
		System.out.println(p2.getScores());
		
		//从json字符串重构为JsonNode对象
		JsonNode node = om.readTree(jsonStr);
		System.out.println(node.get("name").asText());
		System.out.println(node.get("age").asText());
		System.out.println(node.get("scores"));		
	}
	
	static void testJsonFile() throws IOException {
		ObjectMapper om = new ObjectMapper();
		
		//从json文件中加载,并重构为java对象
		File json2 = new File("books2.json");
		List<Book> books = om.readValue(json2, new TypeReference<List<Book>>(){});
		for (Book book : books) {
			System.out.println(book.getAuthor());
			System.out.println(book.getTitle());
		}
	}	
}
//输出
{"name":"Tom","age":20,"scores":[60,70,80]}
Tom
20
[60, 70, 80]
Tom
20
[60,70,80]
=========华丽丽的分割线==============
Giada De Laurentiis
Everyday Italian
J K. Rowling
Harry Potter
Erik T. Ray
Learning XML

JSON和XML比较

  • 都是数据交换格式,可读性强,可扩展性高
  • 大部分情况下,JSON更具有优势(编码简单,转换方便),而且JSON字符长度一般小于XML,传输效率更好
  • XML更加重视标签和顺序
  • JSON会丢失信息
    比如XML中a,+,b,在JSON中会变成,a,b,+
    a,b在JSON中会放到同一个JSONArray中