Java中对JSON的操作

发布于:2025-06-30 ⋅ 阅读:(23) ⋅ 点赞:(0)

什么是JSON

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据。它易于人阅读和编写,同时也易于机器解析和生成。JSON在Web开发、API交互和配置文件等领域广泛应用。

JSON的主要特点包括:

  • 基于键值对结构
  • 数据层次清晰
  • 支持多种数据类型
  • 文件扩展名为.json
  • MIME类型为application/json

JSON语法规则

JSON必须遵循严格的语法规则:

  1. 数据在键值对中,键名必须用双引号括起

    {"name": "张三"}  // 正确
    {name: "张三"}    // 错误
    
  2. 数据由英文逗号分隔

    {
      "name": "张三",
      "age": 25
    }
    
  3. 对象由花括号{}包裹

    {
      "employee": {
        "name": "李四",
        "department": "研发部"
      }
    }
    
  4. 数组由方括号[]包裹

    {
      "skills": ["Java", "Python", "SQL"]
    }
    
  5. 不允许注释:JSON标准不支持注释,虽然某些解析器可能允许。

JSON值的类型

JSON支持以下数据类型:

  1. 字符串(String):必须用双引号括起的Unicode字符序列

    • "Hello World"
    • "中文"
  2. 数字(Number):整数或浮点数

    • 42
    • 3.14
    • -10
  3. 布尔值(Boolean)

    • true
    • false
  4. 空值(Null)

    • null
  5. 对象(Object):无序的键值对集合,用花括号{}包裹

    {
      "person": {
        "name": "王五",
        "age": 30
      }
    }
    
  6. 数组(Array):有序的值集合,用方括号[]包裹

    [1, 2, 3, 4, 5]
    

序列化与反序列化

**序列化(Serialization)**是指将Java对象转换为JSON字符串的过程。例如将User对象转换为:

{
  "name": "赵六",
  "age": 28,
  "email": "zhaoliu@example.com"
}

**反序列化(Deserialization)**则是指将JSON字符串转换回Java对象的过程。

Java中常用的序列化/反序列化方式:

  1. 手动拼接字符串(不推荐)
  2. 使用JSON库(推荐),如:
    • Jackson
    • Gson
    • Fastjson
    • org.json

Jackson技术处理JSON

Jackson基本使用

Jackson是Java生态中最流行的JSON处理库之一,具有以下特点:

  • 高性能
  • 低内存占用
  • 丰富的API
  • 良好的社区支持
  • 支持流式API
  • 支持注解配置

Jackson核心模块:

  1. jackson-core:核心包,定义流式API
  2. jackson-annotations:注解包
  3. jackson-databind:数据绑定包,依赖前两个包

基本使用步骤

  1. 添加依赖(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);

高级功能

  1. 处理日期格式

    objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
    
  2. 忽略空值

    objectMapper.setSerializationInclusion(Include.NON_NULL);
    
  3. 美化输出

    String prettyJson = objectMapper.writerWithDefaultPrettyPrinter()
                                  .writeValueAsString(user);
    
  4. 处理集合

    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));
    
  5. 使用注解

    public class User {
        @JsonProperty("user_name")  // 指定JSON字段名
        private String name;
        
        @JsonIgnore  // 忽略该字段
        private String password;
        
        @JsonFormat(pattern = "yyyy-MM-dd")
        private Date birthDate;
    }
    

异常处理

Jackson操作可能会抛出以下异常:

  1. JsonProcessingException:序列化问题
  2. JsonParseException:JSON解析失败
  3. JsonMappingException:JSON映射到对象失败

建议使用try-catch处理:

try {
    User user = objectMapper.readValue(json, User.class);
} catch (JsonProcessingException e) {
    e.printStackTrace();
}






网站公告

今日签到

点亮在社区的每一天
去签到