柚子快報激活碼778899分享:語法篇-JSON基礎(chǔ)
柚子快報激活碼778899分享:語法篇-JSON基礎(chǔ)
一、JSON初識
1.1基礎(chǔ)認識
????????JSON是一種輕量級的數(shù)據(jù)交換格式,它基于JavaScript語言的對象表示法,可以在多種語言之間進行數(shù)據(jù)交換。JSON的基本數(shù)據(jù)類型有數(shù)值、字符串、布爾值、數(shù)組、對象和空值。JSON的格式簡潔易讀,也易于解析和處理。JSON的標準文件擴展名是.json
采用完全獨立于編程語言的文本格式來存儲和表示數(shù)據(jù)。
????????然而,不是所有的系統(tǒng)都支持使用JSON來交換數(shù)據(jù)。數(shù)據(jù)交換格式有很多,如前面提到的XML (extensible markup language,可擴展性標記語言),可能早在JSON被發(fā)明前就已 經(jīng)在應(yīng)用了。有許多系統(tǒng)可以并還在使用像XML這樣的格式,或是用表格 和分隔符來表示 數(shù)據(jù)的格式,如逗號分隔值(CSV)。
1.2JSON語法
1.2.1專業(yè)術(shù)語及概念
●對象表示為鍵值對,數(shù)據(jù)由逗號分隔 ●花括號保存對象 ●方括號保存數(shù)組
1.2.2JSON基于JavaScript對象字面量
數(shù)據(jù)交換格式的核心是數(shù)據(jù), 所以 JSON中并不會涉及JavaScript對象字面量中的函數(shù)。JSON所基于的JavaScript對象字面量單純指對象字面量及其屬性的語法表示。這種屬性表示方法也就是通過名稱-值對來實現(xiàn)的?
1.2.3名稱-值對
?1.2.4正確的JSON語法
屬性名可以包含下劃線(_?)?或數(shù)字,但是大多數(shù)情況下?最好是使用英文字母A-Z或a-z
在JSON中, 名稱兩邊的雙引號卻是必須要加的。
不同于名稱,?值并不總是需要被雙引號包裹。當值是字符串時,必須使用雙引號。而在JSON?中,還有數(shù)字、?布爾值、數(shù)組、對象、null?等其他數(shù)據(jù)類型,這些都不應(yīng)被雙引號包裹。
1.2.5語法驗證
網(wǎng)上驗證工具
1.2.6JSON文件
JSON這種數(shù)據(jù)交換格式是可以作為獨立的文件存在于文件系統(tǒng)中的。它的文件擴展名非常好記: .json.
1.2.7JSON媒體類型
?1.3JSON的數(shù)據(jù)類型
1.3.1概述
原始數(shù)據(jù)類型復(fù)合數(shù)據(jù)類型
枚舉數(shù)據(jù)類型對象數(shù)據(jù)類型
1.3.2JSON?中的數(shù)據(jù)類型包括
對象字符串數(shù)字布爾值null數(shù)組
?1.3.3對象數(shù)據(jù)類型
?1.3.4字符串數(shù)據(jù)類型
舉例
?1.3.5數(shù)字數(shù)據(jù)類型
1.3.6?布爾數(shù)據(jù)類型
1.3.7?null類型
1.3.8?數(shù)組數(shù)據(jù)類型
?1.3.9總結(jié)
?1.4JSON和JS的區(qū)別
1.5JSON和JS對象互轉(zhuǎn)
二、JSON處理
2.1數(shù)據(jù)類型
2.2常見解析輪子
2.3JSON主要用途
JSON生成JSON解析JSON校驗和Java?Bean對象進行互解析
具有一個無參的構(gòu)造函數(shù)可以包括多個屬性,所有屬性都是private每個屬性都有相應(yīng)的Getter/Setter方法、Java?Bean用于封裝數(shù)據(jù),又可稱為POJO(Plain?Old?Java?Object)
2.4JSON和XML比較
2.5基于org.json的解析
2.5.1 配置文件
2.5.2所用json文件
{
"books": [
{
"author": "J.K. Rowling",
"title": "Harry Potter and the Sorcerer's Stone",
"year": "1997",
"price": 25,
"category": "Fantasy"
},
{
"author": "George Orwell",
"title": "1984",
"year": "1949",
"price": 15,
"category": "Dystopian Fiction"
}
]
}
2.5.3輔助類
package org.example;
public class Book {
private String category;
private String title;
private String author;
private String year;
private int price;
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getYear() {
return year;
}
public void setYear(String year) {
this.year = year;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
@Override
public String toString(){
return "Book [category=" + category + ", title=" + title + ", author=" + author
+ ", year=" + year + ", price=" + price + "]";
}
}
package org.example;
import java.util.List;
public class Person {
private String name;
private int age;
private List
public Person(){
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public List
return scores;
}
public void setScores(List
this.scores = scores;
}
}
2.5.4解析類
package org.example;
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() {
// 構(gòu)造對象
Person p = new Person();
p.setName("Tom");
p.setAge(20);
p.setScores(Arrays.asList(60, 70, 80));
// 構(gòu)造 JSONObject 對象
JSONObject obj = new JSONObject();
obj.put("name", p.getName());
obj.put("age", p.getAge());
obj.put("scores", p.getScores());
// 輸出 JSON 對象內(nèi)容
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("D:\\workspace-java\\untitled4\\src\\main\\resources\\books.json");
try (FileReader reader = new FileReader(file)) {
// 讀取文件內(nèi)容到 Json0bject 對象中
int fileLen = (int) file.length();
char[] chars = new char[fileLen];
reader.read(chars);
String content = String.valueOf(chars);
// 解析 JSON 對象
JSONObject jsonObject = new JSONObject(content);
JSONArray books = jsonObject.getJSONArray("books");
List
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);
}
// 輸出解析結(jié)果
for (Book book : bookList) {
System.out.println(book.getAuthor() + ", " + book.getTitle());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
2.6基于GSON的解析
2.6.1配置文件
2.6.2解析類
package org.example;
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.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;
public class GsonTest {
public static void main(String[] args) {
testJsonObject();
System.out.println("=========華麗麗的分割線==========");
testJsonFile();
}
public static void testJsonObject() {
// 構(gòu)造對象
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]
// 調(diào)用GSON的JsonObject
JsonObject json = gson.toJsonTree(p).getAsJsonObject();
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:\\workspace-java\\untitled4\\src\\main\\resources\\books.json");
try (FileReader reader = new FileReader(file)) {
// 將JSON文件內(nèi)容解析成List
// List>(){}.getType());
// 解析根元素的 JSON 對象
JsonObject rootObject = JsonParser.parseReader(reader).getAsJsonObject();
// 獲取 "books" 屬性對應(yīng)的 JSON 數(shù)組
JsonArray booksArray = rootObject.getAsJsonArray("books");
List>(){}.getType());
for (Book book : books) {
System.out.println(book.getAuthor() + ", " + book.getTitle());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
2.6.3所用json文件
[
{
"author": "Author 1",
"title": "Title 1"
},
{
"author": "Author 2",
"title": "Title 2"
},
{
"author": "Author 3",
"title": "Title 3"
}
]
2.7基于jackson的解析
2.7.1配置
2.7.2解析類
package org.example;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
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();
// 構(gòu)造一個 Person 對象
Person p = new Person();
p.setName("Tom");
p.setAge(20);
p.setScores(Arrays.asList(60, 70, 80));
// 將 Person 對象解析為 JSON 字符串
String jsonStr = om.writeValueAsString(p);
System.out.println(jsonStr);
// 從 JSON 字符串重構(gòu)為 Person 對象
Person p2 = om.readValue(jsonStr, Person.class);
System.out.println("Name: " + p2.getName());
System.out.println("Age: " + p2.getAge());
System.out.println("Scores: " + p2.getScores());
// 從 JSON 字符串重構(gòu)為 JsonNode 對象
JsonNode node = om.readTree(jsonStr);
System.out.println("Name from JsonNode: " + node.get("name").asText());
System.out.println("Age from JsonNode: " + node.get("age").asText());
System.out.println("Scores from JsonNode: " + node.get("scores"));
}
static void testJsonFile() throws IOException {
ObjectMapper om = new ObjectMapper();
// 從 JSON 文件中加載,并重構(gòu)為 Java 對象
File jsonFile = new File("D:\\workspace-java\\untitled4\\src\\main\\resources\\books2.json");
List>() {
});
// 打印書籍信息
for (Book book : books) {
System.out.println("Author: " + book.getAuthor());
System.out.println("Title: " + book.getTitle());
}
}
}
2.8基于fastjson的解析
fastjson.jar是阿里開發(fā)的一款專門用于Java開發(fā)的包,可以方便的實現(xiàn)json對象與JavaBean對象的轉(zhuǎn)換,實現(xiàn)JavaBean對象與json字符串的轉(zhuǎn)換,實現(xiàn)json對象與json字符串的轉(zhuǎn)換。實現(xiàn)json的轉(zhuǎn)換方法很多,最后的實現(xiàn)結(jié)果都是一樣的。
2.8.1配置
?2.8.2解析類
fastjson 三個主要的類:
JSONObject ?代表 json 對象
JSONObject實現(xiàn)了Map接口, 猜想 JSONObject底層操作是由Map實現(xiàn)的。 JSONObject對應(yīng)json對象,通過各種形式的get()方法可以獲取json對象中的數(shù)據(jù),也可利用諸如size(),isEmpty()等方法獲取"鍵:值"對的個數(shù)和判斷是否為空。其本質(zhì)是通過實現(xiàn)Map接口并調(diào)用接口中的方法完成的。
JSONArray ? 代表 json 對象數(shù)組
內(nèi)部是有List接口中的方法來完成操作的。
JSON代表 JSONObject和JSONArray的轉(zhuǎn)化
JSON類源碼分析與使用 仔細觀察這些方法,主要是實現(xiàn)json對象,json對象數(shù)組,javabean對象,json字符串之間的相互轉(zhuǎn)化。
2.8.2測試類
package org.example;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
//需要導(dǎo)入lombok
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private String name;
private int age;
private String sex;
}
package org.example;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import java.util.ArrayList;
import java.util.List;
public class FastJsonDemo {
public static void main(String[] args) {
//創(chuàng)建一個對象
User user1 = new User("1號", 3, "男");
User user2 = new User("2號", 3, "男");
User user3 = new User("3號", 3, "男");
User user4 = new User("4號", 3, "男");
List
list.add(user1);
list.add(user2);
list.add(user3);
list.add(user4);
System.out.println("*******Java對象 轉(zhuǎn) JSON字符串*******");
String str1 = JSON.toJSONString(list);
System.out.println("JSON.toJSONString(list)==>"+str1);
String str2 = JSON.toJSONString(user1);
System.out.println("JSON.toJSONString(user1)==>"+str2);
System.out.println("\n****** JSON字符串 轉(zhuǎn) Java對象*******");
User jp_user1=JSON.parseObject(str2,User.class);
System.out.println("JSON.parseObject(str2,User.class)==>"+jp_user1);
System.out.println("\n****** Java對象 轉(zhuǎn) JSON對象 ******");
JSONObject jsonObject1 = (JSONObject) JSON.toJSON(user2);
System.out.println("(JSONObject) JSON.toJSON(user2)==>"+jsonObject1.getString("name"));
System.out.println("\n****** JSON對象 轉(zhuǎn) Java對象 ******");
User to_java_user = JSON.toJavaObject(jsonObject1, User.class);
System.out.println("JSON.toJavaObject(jsonObject1, User.class)==>"+to_java_user);
}
}
柚子快報激活碼778899分享:語法篇-JSON基礎(chǔ)
精彩內(nèi)容
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。