Java中JSON数据操作与处理全面指南

 更新时间:2024年10月08日 09:59:40   作者:总是学不会.  
JSON(JavaScript Object Notation)是数据交换的轻量级格式,它以易于人类阅读和机器解析的方式组织数据,基于键值对,在Java开发中,处理JSON数据通常涉及使用Jackson、Gson、Fastjson等库,本文给大家介绍JSON数据操作与处理全面指南,感兴趣的朋友一起看看吧

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛应用于前后端的数据传递和API通信中。它基于键值对的方式组织数据,便于人类阅读和机器解析。在Java开发中,处理JSON数据通常需要使用一些常见的库,如Jackson、Gson、Fastjson等。本篇将介绍JSON的基本概念、常用操作及在Java中的具体应用。

一、JSON的基本概念

JSON的数据结构包括两种:对象数组

对象:使用 {} 括起来,内部是键值对的集合,每个键和值之间用冒号 : 分隔,多个键值对之间用逗号 , 分隔。例如:

{
  "name": "Alice",
  "age": 25,
  "address": {
    "city": "New York",
    "zip": "10001"
  }
}

数组:使用 [] 括起来,内部是多个值,每个值之间用逗号分隔。例如:

[
  "apple",
  "banana",
  "cherry"
]

二、JSON处理常见库

1. Jackson

Jackson 是Java中处理JSON最常用的库之一,它能够轻松地将Java对象与JSON字符串互相转换,具备高效、灵活、功能强大的特点。

对象转JSON

ObjectMapper objectMapper = new ObjectMapper();
User user = new User("Alice", 25);
String jsonString = objectMapper.writeValueAsString(user);

JSON转对象

String jsonString = "{\"name\":\"Alice\", \"age\":25}";
User user = objectMapper.readValue(jsonString, User.class);

Jackson还支持复杂类型的解析、忽略字段、日期格式化等高级功能。

2. Gson

Gson 是由Google提供的另一款流行的JSON处理库。它以轻量、易用著称,适合处理简单的JSON数据结构。

对象转JSON

Gson gson = new Gson();
User user = new User("Bob", 30);
String jsonString = gson.toJson(user);

JSON转对象

String jsonString = "{\"name\":\"Bob\", \"age\":30}";
User user = gson.fromJson(jsonString, User.class);

Gson的API风格简单明了,但在性能上可能略逊于Jackson。

3. Fastjson

Fastjson 是阿里巴巴开源的高性能JSON库,特别在解析大量JSON数据时表现出色。

对象转JSON

User user = new User("Charlie", 28);
String jsonString = JSON.toJSONString(user);

JSON转对象

String jsonString = "{\"name\":\"Charlie\", \"age\":28}";
User user = JSON.parseObject(jsonString, User.class);

Fastjson支持丰富的序列化/反序列化选项,还能够处理JSONPath等高级功能。

三、JSON的常见操作

1. 解析复杂的JSON结构

通常我们处理的JSON不仅仅是简单的对象,还可能是嵌套的对象或数组。以Jackson为例,我们可以使用 TypeReference 来处理复杂的嵌套类型。

String jsonString = "[{\"name\":\"Alice\",\"age\":25},{\"name\":\"Bob\",\"age\":30}]";
ObjectMapper mapper = new ObjectMapper();
List<User> users = mapper.readValue(jsonString, new TypeReference<List<User>>(){});

2. JSON与Map互转

在实际开发中,有时我们希望将JSON数据转为 Map<String, Object>,以便于动态操作数据。

JSON转Map

ObjectMapper objectMapper = new ObjectMapper();
String jsonString = "{\"name\":\"Alice\", \"age\":25}";
Map<String, Object> map = objectMapper.readValue(jsonString, new TypeReference<Map<String,Object>>(){});

Map转JSON

Map<String, Object> map = new HashMap<>();
map.put("name", "Alice");
map.put("age", 25);
String jsonString = objectMapper.writeValueAsString(map);

3. 处理日期和时间格式

JSON默认不支持日期格式,因此在处理日期类型的字段时需要特别处理。以Jackson为例,可以通过 @JsonFormat 注解指定日期格式。

public class Event {
  @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
  private Date eventDate;
  // getters and setters
}

反序列化时,也可以全局配置 ObjectMapper 以处理日期格式:

ObjectMapper mapper = new ObjectMapper();
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));

4. 忽略字段

在序列化/反序列化时,我们可能需要忽略某些不必要的字段。以Jackson为例,可以通过 @JsonIgnore 注解来忽略字段。

public class User {
  private String name;
  @JsonIgnore
  private String password;
  // getters and setters
}

这将确保 password 字段不会出现在生成的JSON中。

5. 获取Json数据中某个字段

    // 获取params里面的documentId
    JsonNode jsonNode = new ObjectMapper().readTree(record.getParams());
    if (jsonNode.has("documentId")) {
        Integer documentId = jsonNode.get("documentId").asInt();
        record.setDocTypeId(documentId);
        if (clearLogDto.getDocTypeId() != null && !documentId.equals(clearLogDto.getDocTypeId())) {
            delete.add(record);
        }
    }

性能对比

在选择JSON库时,性能是一个重要的考虑因素。下表简要对比了Jackson、Gson、Fastjson三者的性能表现:

特性JacksonGsonFastjson
性能
易用性
功能丰富性
社区支持

参考:

JSON处理——FastJson、Jackson、Gson详细使用_gson fastjson-CSDN博客

到此这篇关于JSON数据操作与处理全面指南的文章就介绍到这了,更多相关JSON数据操作内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用mvn deploy命令上传jar包的实现

    使用mvn deploy命令上传jar包的实现

    本文介绍了使用mvndeploy:deploy-file命令将本地仓库中的JAR包重新发布到Maven私服,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-03-03
  • 浅谈Java中static关键字的作用

    浅谈Java中static关键字的作用

    这篇文章主要介绍了Java中static关键字的作用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • 浅谈关于Java中TimeZone锁竞争引发的问题解决

    浅谈关于Java中TimeZone锁竞争引发的问题解决

    本文主要介绍了浅谈关于Java中TimeZone锁竞争引发的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-02-02
  • RabbitMQ在微服务架构中的落地:消息推送 / 解耦 / 削峰填谷

    RabbitMQ在微服务架构中的落地:消息推送 / 解耦 / 削峰填谷

    本文介绍了RabbitMQ在微服务架构中的三大应用场景:消息推送、服务解耦和削峰填谷,通过实际代码示例展示了如何在实际项目中应用RabbitMQ实现这些模式,感兴趣的朋友一起看看吧
    2026-05-05
  • 浅谈Java线程并发知识点

    浅谈Java线程并发知识点

    本文主要对Java线程并发的知识点进行简单介绍。具有很好的参考价值,需要的朋友一起来看下吧
    2016-12-12
  • Java必备知识之位运算及常见进制解读

    Java必备知识之位运算及常见进制解读

    从现代计算机中所有的数据二进制的形式存储在设备中。即 0、1 两种状态,计算机对二进制数据进行的运算(+、-、*、/)都是叫位运算,即将符号位共同参与运算的运算
    2021-10-10
  • Java干货知识深入理解内部类

    Java干货知识深入理解内部类

    这篇文章主要介绍了Java干货知识深入理解内部类,定义在另一个类或方法中的类就叫做内部类,需要的朋友可以参考下
    2019-06-06
  • SpringCloud配置刷新原理解析

    SpringCloud配置刷新原理解析

    这篇文章主要介绍了SpringCloud之配置刷新的原理,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-05-05
  • Java 通过API操作GraphQL

    Java 通过API操作GraphQL

    这篇文章主要介绍了Java 通过API操作GraphQL的方法,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-05-05
  • 跨域解决方案Jsonp原理解析

    跨域解决方案Jsonp原理解析

    这篇文章主要介绍了跨域解决方案Jsonp原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02

最新评论