一、JSON簡介
JSON(JavaScript Object Notation)是一種輕量級的數據交換格式,是基於JavaScript語言的一個子集,具有良好的可讀性和便於處理的特點。相較於XML格式,JSON更加簡單,易於讀寫和解析,可廣泛適用於各種語言環境的應用程序之間進行數據交互。
二、JSON字符串的基本結構
JSON字符串由對象和數組兩種數據結構組成。對象由一組鍵值對(key-value pair)構成,鍵用字符串表示,值可以是對象、數組、字符串、數字、布爾值和null。數組由一組有序的值組成,同樣可以是對象、數組、字符串、數字、布爾值和null。
1. 對象
{
"name": "John",
"age": 30,
"city": "New York"
}
以上是一個簡單的JSON對象,由三個鍵值對構成,鍵分別為name、age和city,對應的值為字符串”John”、數字30和字符串”New York”。
2. 數組
[
{
"name": "John",
"age": 30,
"city": "New York"
},
{
"name": "Mary",
"age": 25,
"city": "Paris"
}
]
以上是一個包含兩個JSON對象的數組,對象的結構與前面相同。注意,數組中的對象可以是相同的結構,也可以是不同的結構。
三、Java中的JSON解析
在Java中,JSON解析庫有很多種,常見的有GSON、Jackson和Fastjson。接下來以GSON為例,介紹Java中如何將JSON字符串轉換為JSON對象。
1. 添加依賴
首先,需要在項目中添加GSON的依賴。Maven用戶可在pom.xml中添加以下配置:
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.7</version> </dependency>
Gradle用戶可在build.gradle中添加以下配置:
dependencies {
implementation 'com.google.code.gson:gson:2.8.7'
}
2. 字符串轉JSON對象
GSON庫提供了fromJson()方法,可以將JSON串轉換為Java對象。下面是一個示例代碼:
import com.google.gson.Gson;
public class Main {
public static void main(String[] args) {
String json = "{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}";
Gson gson = new Gson();
Person person = gson.fromJson(json, Person.class);
System.out.println(person.getName());
System.out.println(person.getAge());
System.out.println(person.getCity());
}
}
class Person {
private String name;
private int age;
private String city;
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 String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
}
在此示例代碼中,我們創建了一個Person類來保存JSON對象的數據。使用fromJson()方法,將JSON字符串轉換為Person對象,然後可以通過get()方法獲取對象的屬性。
3. JSON數組轉換為Java集合
GSON庫同樣可以將JSON數組解析為Java集合。示例代碼如下:
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.util.List;
public class Main {
public static void main(String[] args) {
String json = "[{\"name\":\"John\",\"age\":30,\"city\":\"New York\"},{\"name\":\"Mary\",\"age\":25,\"city\":\"Paris\"}]";
Gson gson = new Gson();
List<Person> personList = gson.fromJson(json, new TypeToken<List<Person>>(){}.getType());
for (Person person : personList) {
System.out.println(person.getName());
System.out.println(person.getAge());
System.out.println(person.getCity());
}
}
}
class Person {
private String name;
private int age;
private String city;
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 String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
}
在此示例代碼中,我們創建了List<Person>集合用於存儲JSON數組的內容。使用fromJson()方法,將JSON數組轉換為List<Person>對象,然後通過for-each循環遍歷每個Person對象,獲取其屬性值。
四、JSON字符串的優化處理
處理JSON字符串時,如果字符串中包含多層嵌套的子對象、數組,可能會導致代碼冗長、效率低下的情況。下面介紹兩種優化處理方式。
1. 使用Jackson庫
Jackson是另一種流行的JSON解析庫,它可以輕鬆處理複雜的JSON結構,提供了更多的功能和擴展性。使用Jackson庫的示例代碼如下:
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.util.List;
public class Main {
public static void main(String[] args) throws IOException {
String json = "{\"name\":\"John\",\"age\":30,\"address\":{\"city\":\"New York\",\"state\":\"NY\"},\"phoneNumbers\":[\"212-555-1234\",\"646-555-4567\"]}";
ObjectMapper mapper = new ObjectMapper();
Person person = mapper.readValue(json, Person.class);
System.out.println(person.getName());
System.out.println(person.getAge());
System.out.println(person.getAddress().getCity());
System.out.println(person.getPhoneNumbers().get(0));
}
}
class Person {
private String name;
private int age;
private Address address;
private List<String> phoneNumbers;
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 Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public List<String> getPhoneNumbers() {
return phoneNumbers;
}
public void setPhoneNumbers(List<String> phoneNumbers) {
this.phoneNumbers = phoneNumbers;
}
}
class Address {
private String city;
private String state;
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}
在此示例代碼中,JSON對象中包含了一個嵌套的Address對象和一個由字符串組成的嵌套數組。使用Jackson庫,通過readValue()方法可以輕鬆解決這個問題。
2. 使用JSON Path
JSON Path是一種類似於XPath的查詢語言,可以方便地在JSON結構中進行導航和查找。在Java中,可以使用Jayway JSON Path庫。示例代碼如下:
import com.jayway.jsonpath.JsonPath;
public class Main {
public static void main(String[] args) {
String json = "{\"store\":{\"book\":[{\"category\":\"reference\",\"author\":\"Nigel Rees\",\"title\":\"Sayings of the Century\",\"price\":8.95},{\"category\":\"fiction\",\"author\":\"Evelyn Waugh\",\"title\":\"Sword of Honour\",\"price\":12.99}],\"bicycle\":{\"color\":\"red\",\"price\":19.95}}}";
String author = JsonPath.read(json, "$.store.book[0].author");
System.out.println(author);
}
}
在此示例代碼中,使用JsonPath.read()方法和JSON Path表達式”$store.book[1].author”來獲取到JSON串中的一個作者名字。
五、總結
本文介紹了JSON數據結構的基本格式和Java中JSON解析庫的使用,同時也討論了如何優化處理複雜JSON結構。在實際開發中,處理JSON數據結構是一個十分常見的任務,因此對於JSON的基礎知識和解析技能的掌握非常必要。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/304212.html
微信掃一掃
支付寶掃一掃