Java中对JSON的操作
什么是JSON
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据。它易于人阅读和编写,同时也易于机器解析和生成。JSON在Web开发、API交互和配置文件等领域广泛应用。
JSON的主要特点包括:
- 基于键值对结构
- 数据层次清晰
- 支持多种数据类型
- 文件扩展名为.json
- MIME类型为application/json
JSON语法规则
JSON必须遵循严格的语法规则:
-
数据在键值对中,键名必须用双引号括起:
{"name": "张三"} // 正确 {name: "张三"} // 错误
-
数据由英文逗号分隔:
{"name": "张三","age": 25 }
-
对象由花括号{}包裹:
{"employee": {"name": "李四","department": "研发部"} }
-
数组由方括号[]包裹:
{"skills": ["Java", "Python", "SQL"] }
-
不允许注释:JSON标准不支持注释,虽然某些解析器可能允许。
JSON值的类型
JSON支持以下数据类型:
-
字符串(String):必须用双引号括起的Unicode字符序列
"Hello World"
"中文"
-
数字(Number):整数或浮点数
42
3.14
-10
-
布尔值(Boolean):
true
false
-
空值(Null):
null
-
对象(Object):无序的键值对集合,用花括号{}包裹
{"person": {"name": "王五","age": 30} }
-
数组(Array):有序的值集合,用方括号[]包裹
[1, 2, 3, 4, 5]
序列化与反序列化
**序列化(Serialization)**是指将Java对象转换为JSON字符串的过程。例如将User对象转换为:
{"name": "赵六","age": 28,"email": "zhaoliu@example.com"
}
**反序列化(Deserialization)**则是指将JSON字符串转换回Java对象的过程。
Java中常用的序列化/反序列化方式:
- 手动拼接字符串(不推荐)
- 使用JSON库(推荐),如:
- Jackson
- Gson
- Fastjson
- org.json
Jackson技术处理JSON
Jackson基本使用
Jackson是Java生态中最流行的JSON处理库之一,具有以下特点:
- 高性能
- 低内存占用
- 丰富的API
- 良好的社区支持
- 支持流式API
- 支持注解配置
Jackson核心模块:
- jackson-core:核心包,定义流式API
- jackson-annotations:注解包
- jackson-databind:数据绑定包,依赖前两个包
基本使用步骤
- 添加依赖(Maven示例):
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.0</version> </dependency>
详情参考文章:https://blog.csdn.net/Y1_again_0_again/article/details/148828971?spm=1001.2014.3001.5502
1. 创建JSON文件存储JSON数据
方法一:在resources文件夹(存放源文件)上右击,选择"New"→"File"。输入文件名时需添加.json后缀表示创建json文件格式,然后将JSON数据写入该文件即可。
方法二:使用代码完成
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;// 创建ObjectMapper实例
ObjectMapper mapper = new ObjectMapper();
// 示例数据
Map<String, Object> data = new HashMap<>();
data.put("name", "张三");
data.put("age", 25);
data.put("isStudent", true);
data.put("courses", Arrays.asList("数学", "物理", "化学"));// 将数据写入JSON文件
mapper.writeValue(new File("student.json"), data);
2. 创建JSON文件对应的实体类
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data // 自动添加 get&set 方法、toString 方法
@AllArgsConstructor // 自动添加有参构造方法
@NoArgsConstructor // 自动添加无参构造方法
public class Student {private String name;private int age;private boolean isStudent;private List<String> courses;}
注意:使用lombok插件快速创建实体类需要下载对应依赖包,详情见文档
https://blog.csdn.net/Y1_again_0_again/article/details/148832100?spm=1001.2014.3001.5502
3. 将JSON转换为Java对象
// 从JSON文件读取并转换为Student对象
ObjectMapper mapper = new ObjectMapper();
//第一个参数:读取的json文件file对象类型--所以需要new File先创建一个文件对象
//第二个参数:反序列化操作对应的实体类
Student student = mapper.readValue(new File("student.json"),Student.class);
// 从JSON字符串读取
String jsonStr = "{\"name\":\"李四\",\"age\":22,\"isStudent\":true}";
Student student2 = mapper.readValue(jsonStr, Student.class);
获取 JSON 文件路径的方法:右键点击文件,选择"Copy"→"Copy Path",然后根据需要选择"Absolute Path"(复制绝对路径)或"Path From Content Root"(复制相对路径)。通常建议选择"Path From Content Root",这样在项目路径变更时,相对路径仍能保持有效。
4. 将JSON转换为HashMap集合对象
// 读取JSON到Map
Map<String, Object> dataMap = mapper.readValue(new File("student.json"), HashMap.class);
// 访问Map中的数据
String name = (String) dataMap.get("name");
int age = (Integer) dataMap.get("age");
List<String> courses = (List<String>) dataMap.get("courses");
5. 将Java对象转换为JSON
// 创建Student对象
Student studentObj = new Student();
studentObj.setName("王五");
studentObj.setAge(23);
studentObj.setStudent(false);
studentObj.setCourses(Arrays.asList("历史", "地理"));// 转换为JSON字符串
String jsonOutput = mapper.writeValueAsString(studentObj);// 写入JSON文件
mapper.writeValue(new File("output.json"), studentObj);
6. 将HashMap集合对象转换为JSON
// 创建Map数据
Map<String, Object> mapData = new HashMap<>();
mapData.put("product", "手机");
mapData.put("price", 2999.99);
mapData.put("inStock", true);
mapData.put("colors", Arrays.asList("黑色", "白色", "蓝色"));// 转换为JSON字符串
String jsonMapString = mapper.writeValueAsString(mapData);// 写入JSON文件
mapper.writeValue(new File("product.json"), mapData);
高级功能
-
处理日期格式:
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
-
忽略空值:
objectMapper.setSerializationInclusion(Include.NON_NULL);
-
美化输出:
String prettyJson = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(user);
-
处理集合:
List<User> users = Arrays.asList(new User("A", 20), new User("B", 30)); String json = objectMapper.writeValueAsString(users);List<User> userList = objectMapper.readValue(json, objectMapper.getTypeFactory().constructCollectionType(List.class, User.class));
-
使用注解:
public class User {@JsonProperty("user_name") // 指定JSON字段名private String name;@JsonIgnore // 忽略该字段private String password;@JsonFormat(pattern = "yyyy-MM-dd")private Date birthDate; }
异常处理
Jackson操作可能会抛出以下异常:
JsonProcessingException
:序列化问题JsonParseException
:JSON解析失败JsonMappingException
:JSON映射到对象失败
建议使用try-catch处理:
try {User user = objectMapper.readValue(json, User.class);
} catch (JsonProcessingException e) {e.printStackTrace();
}