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中