Java中解析JSON的全面指南:从基础到实践**
JSON(JavaScript Object Notation)作为一种轻量级、易读易写的数据交换格式,已经成为现代软件开发中不可或缺的一部分,在Java应用中,无论是处理前后端交互数据、调用第三方服务API,还是读取配置文件,都经常会遇到JSON数据的解析与生成,本文将详细介绍在Java中解析JSON的几种主流方法,从基础的库使用到实际应用场景,帮助你快速JSON解析技能。
为什么需要解析JSON?
在Java中,我们通常处理的是对象(Object)和基本数据类型,而JSON是一种文本格式,它表示的是键值对(key-value)的集合(类似于Java中的Map)或值的有序列表(类似于Java中的List),为了在Java程序中使用JSON数据中的信息,我们需要将其“转换”成Java对象,这个过程就是解析(Parsing),反之,将Java对象转换为JSON字符串的过程则称为序列化(Serialization)。
主流的Java JSON解析库
Java生态中有多个优秀的JSON处理库,它们各有特点,适用于不同的场景,以下是最常用的几个:
- Gson:由Google开发,简单易用,功能强大,能很好地处理复杂的Java对象与JSON的转换。
- Jackson:目前最流行、性能最高的JSON库之一,广泛应用于Spring Framework等主流框架中。
- org.json:一个轻量级的JSON库,API简单直观,适合处理不太复杂的JSON场景。
- JSON-P (Java API for JSON Processing) 和 JSON-P (Java API for JSON Binding):这是Java EE(Jakarta EE)提供的官方JSON处理标准,JSON-P用于解析和生成JSON对象(类似于DOM解析),JSON-B则用于绑定JSON与Java对象。
使用Gson解析JSON
Gson以其简洁的API深受开发者喜爱。
添加依赖 (Maven):
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version> <!-- 使用最新版本 -->
</dependency>
基本解析示例:
假设我们有以下JSON字符串:
{
"name": "张三",
"age": 30,
"isStudent": false,
"courses": ["Java", "Python", "JavaScript"],
"address": {
"city": "北京",
"district": "海淀区"
}
}
创建对应的Java类 (POJO - Plain Old Java Object)
public class Person {
private String name;
private int age;
private boolean isStudent;
private List<String> courses;
private Address address;
// 需要无参构造器
public Person() {}
// getter 和 setter 方法
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 boolean isStudent() { return isStudent; }
public void setStudent(boolean student) { isStudent = student; }
public List<String> getCourses() { return courses; }
public void setCourses(List<String> courses) { this.courses = courses; }
public Address getAddress() { return address; }
public void setAddress(Address address) { this.address = address; }
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", isStudent=" + isStudent +
", courses=" + courses +
", address=" + address +
'}';
}
}
public class Address {
private String city;
private String district;
// 无参构造器、getter、setter、toString()
public Address() {}
public String getCity() { return city; }
public void setCity(String city) { this.city = city; }
public String getDistrict() { return district; }
public void setDistrict(String district) { this.district = district; }
@Override
public String toString() {
return "Address{" +
"city='" + city + '\'' +
", district='" + district + '\'' +
'}';
}
}
使用Gson进行解析
import com.google.gson.Gson;
public class GsonParserExample {
public static void main(String[] args) {
String jsonString = "{\"name\":\"张三\",\"age\":30,\"isStudent\":false,\"courses\":[\"Java\",\"Python\",\"JavaScript\"],\"address\":{\"city\":\"北京\",\"district\":\"海淀区\"}}";
Gson gson = new Gson();
Person person = gson.fromJson(jsonString, Person.class);
System.out.println(person.getName());
System.out.println(person.getAge());
System.out.println(person.getAddress().getCity());
System.out.println(person);
}
}
解析JSON数组:
如果JSON是一个数组,"[{\"name\":\"张三\"},{\"name\":\"李四\"}]",可以将其解析为List<Person>:
String jsonArrayString = "[{\"name\":\"张三\",\"age\":30},{\"name\":\"李四\",\"age\":25}]";
Person[] personArray = gson.fromJson(jsonArrayString, Person[].class);
// 或者
List<Person> personList = gson.fromJson(jsonArrayString, new TypeToken<List<Person>>(){}.getType());
使用Jackson解析JSON
Jackson是性能和功能都非常出色的选择,尤其在大数据量处理上表现优异。
添加依赖 (Maven):
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version> <!-- 使用最新版本 -->
</dependency>
基本解析示例:
使用与Gson相同的Person和Address类。
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonParserExample {
public static void main(String[] args) {
String jsonString = "{\"name\":\"张三\",\"age\":30,\"isStudent\":false,\"courses\":[\"Java\",\"Python\",\"JavaScript\"],\"address\":{\"city\":\"北京\",\"district\":\"海淀区\"}}";
ObjectMapper objectMapper = new ObjectMapper();
try {
Person person = objectMapper.readValue(jsonString, Person.class);
System.out.println(person.getName());
System.out.println(person.getAge());
System.out.println(person.getAddress().getCity());
System.out.println(person);
// 解析JSON数组
String jsonArrayString = "[{\"name\":\"张三\",\"age\":30},{\"name\":\"李四\",\"age\":25}]";
List<Person> personList = objectMapper.readValue(jsonArrayString, new TypeReference<List<Person>>() {});
System.out.println(personList);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
}
Jackson的API与Gson非常相似,核心方法也是readValue,它还支持更多高级特性,如注解(@JsonProperty, @JsonIgnore等)来自定义映射行为。
使用org.json解析JSON
这是一个轻量级库,适合简单场景,不需要创建复杂的POJO。
添加依赖 (Maven):
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20231013</version> <!-- 使用最新版本 -->
</dependency>
基本解析示例:
import org.json.JSONObject;
import org.json.JSONArray;
public class OrgJsonParserExample {
public static void main(String[] args) {
String jsonString = "{\"name\":\"张三\",\"age\":30,\"isStudent\":false,\"courses\":[\"Java\",\"Python\",\"JavaScript\"],\"address\":{\"city\":\"北京\",\"district\":\"海淀区\"}}";
JSONObject jsonObject = new JSONObject(jsonString);
String name = jsonObject.getString("name");
int age = jsonObject.getInt("age");
boolean isStudent = jsonObject.getBoolean("isStudent");
JSONArray courses = jsonObject.getJSONArray("courses");
JSONObject addressJson = jsonObject.getJSONObject("address");
String city = addressJson.getString("city");
System.out.println("Name: " + name);
System.out.println("Age: " + age);
System.out.println("Is Student: " + isStudent);
System.out.println("Courses: " + courses);
System.out.println("City: " + city);
// 解析JSON数组
String jsonArrayString = "[{\"name\":\"张三\",\"age\":30},{\"name\":\"李四\",\"age\":25}]";
JSONArray jsonArray = new JSONArray(jsonArrayString);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject obj = jsonArray.getJSONObject(i);
System.out.println("Person " + (i+1) + ": " + obj.getString("name") + ", Age: " + obj.getInt("age"));
}
}
}
org.json提供了JSONObject和JSONArray类,通过直接调用方法获取数据,灵活性高,但类型需要手动转换,对于复杂结构处理



还没有评论,来说两句吧...