一、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