前言
这里总结了一下JSON的相关知识
博文首发博客
概念
JavaScript Object Notation,JS对象表示法.
- 轻量级的数据交换格式
- 更小,更快,更易解析
- 独立于编程语言
JSONObject : 名称/值对
{
"name":"yujian95",
"email":"clj9509@163.com"
}
JSONArray(数组)
[
{
"name":"yujian95",
"email":"clj9509@163.com"
},
{
"name":"遇见1995",
"email":"clj9509@163.com"
}
]
实践
- 生成
- 解析
- 校验
- 转换为JavaBean
常用类包
包名 | 说明 | 特点 |
---|---|---|
org.json | 官方推荐 | 通用,但复杂 |
GSON | 基于反射,实现JSON对象,字串和java对象互转 | |
Jackson | 号称最快 | 简易 |
org.json
- put(“key”,value):输入键值对
- get(“key”):获取值
- getJSONArray(“scores”):获取指定数组值
Maven依赖
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20160810</version>
</dependency>
public static void testJsonObject(){
User user = new User();
user.setUserName("yujian95");
user.setRole("admin");
user.setId(1);
user.setPassword("password");
// 构建对象
JSONObject object = new JSONObject();
object.put("username",user.getUserName());
object.put("id" ,user.getId());
object.put("role",user.getRole());
object.put("password",user.getPassword());
// 解析对象
System.out.println(object);
System.out.println("name:"+object.getString("username"));
System.out.println("role:"+object.getString("role"));
System.out.println("id:"+object.getInt("id"));
System.out.println("password:"+object.getString("password"));
}
// 读取文件
public static void testJsonFile() {
File file = new File("com/user.json");
try {
FileReader reader = new FileReader(file);
int fileLen = (int) file.length();
char[] chars = new char[fileLen];
reader.read(chars);
String s = String.valueOf(chars);
JSONObject object = new JSONObject(s);
System.out.println(object);
System.out.println("name:" + object.getString("username"));
System.out.println("role:" + object.getString("role"));
System.out.println("id:" + object.getInt("id"));
System.out.println("password:" + object.getString("password"));
} catch (Exception e) {
}
}
Gson
Maven依赖
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.7</version>
</dependency>
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("D:\\MavenLearn\\src\\main\\java\\com\\books2.json");
try (FileReader reader = new FileReader(file)) {
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();
}
}
jackson
Maven依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.6</version>
</dependency>
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("D:\\MavenLearn\\src\\main\\java\\com\\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());
}
}
与xml的对比
- 正常情况下,JSON比较快.
- xml 注重标签顺序.
- JSON 丢失信息(顺序性会变).