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数据操作内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java Map.getOrDefault方法详解

    Java Map.getOrDefault方法详解

    Map.getOrDefault(Object key, V defaultValue)是Java中Map接口的一个方法,用于获取指定键对应的值,如果键不存在,则返回一个默认值,这篇文章主要介绍了Java Map.getOrDefault方法详解,需要的朋友可以参考下
    2024-01-01
  • Java类加载机制实现流程及原理详解

    Java类加载机制实现流程及原理详解

    这篇文章主要介绍了Java类加载机制实现流程及原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • java开发SSM框架具有rest风格的SpringMVC

    java开发SSM框架具有rest风格的SpringMVC

    这篇文章主要介绍了java开发中如何使SSM框架具有rest风格的SpringMVC实现解析,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-10-10
  • 继承JpaRepository后,找不到findOne()方法的解决

    继承JpaRepository后,找不到findOne()方法的解决

    这篇文章主要介绍了继承JpaRepository后,找不到findOne()方法的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Spring Cloud Netflix架构浅析(小结)

    Spring Cloud Netflix架构浅析(小结)

    这篇文章主要介绍了Spring Cloud Netflix架构浅析(小结),详解的介绍了Spring Cloud Netflix的概念和组件等,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • Java源码解析之ClassLoader

    Java源码解析之ClassLoader

    在看系统启动的流程中看到了ClassLoader使用,重新温故下ClassLoader流程和原理,文中有非常详细的代码示例,对正在学习java的小伙伴们很有帮助,需要的朋友可以参考下
    2021-05-05
  • Java 数据结构之堆的概念与应用

    Java 数据结构之堆的概念与应用

    堆是一颗完全二叉树,在这棵树中,所有父节点都满足大于等于其子节点的堆叫大根堆,所有父节点都满足小于等于其子节点的堆叫小根堆,堆虽然是一颗树,但是通常存放在一个数组中,父节点和孩子节点的父子关系通过数组下标来确定
    2021-10-10
  • 使用springboot开发的第一个web入门程序的实现

    使用springboot开发的第一个web入门程序的实现

    这篇文章主要介绍了使用springboot开发的第一个web入门程序的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 使用Java8进行分组(多个字段的组合分组)

    使用Java8进行分组(多个字段的组合分组)

    本文主要介绍了使用Java8进行分组(多个字段的组合分组),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Javassist之一秒理解java动态编程

    Javassist之一秒理解java动态编程

    概述Javassist是一款字节码编辑工具,可以直接编辑和生成Java生成的字节码,以达到对.class文件进行动态修改的效果。
    2019-06-06

最新评论