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

embedded/2024/10/11 3:00:46/

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

文章目录

      • 一、JSON的基本概念
      • 二、JSON处理常见库
        • 1. Jackson
        • 2. Gson
        • 3. Fastjson
      • 三、JSON的常见操作
        • 1. 解析复杂的JSON结构
        • 2. JSON与Map互转
        • 3. 处理日期和时间格式
        • 4. 忽略字段
        • 5. 获取Json数据中某个字段
      • 性能对比
      • 参考:

一、JSON的基本概念

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

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

    json">{"name": "Alice","age": 25,"address": {"city": "New York","zip": "10001"}
    }
    
  • 数组:使用 [] 括起来,内部是多个值,每个值之间用逗号分隔。例如:

    json">["apple","banana","cherry"
    ]
    

二、JSON处理常见库

1. Jackson

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

  • 对象转JSON

    java">ObjectMapper objectMapper = new ObjectMapper();
    User user = new User("Alice", 25);
    String jsonString = objectMapper.writeValueAsString(user);
    
  • JSON转对象

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

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

2. Gson

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

  • 对象转JSON

    java">Gson gson = new Gson();
    User user = new User("Bob", 30);
    String jsonString = gson.toJson(user);
    
  • JSON转对象

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

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

json_73">3. Fastjson

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

  • 对象转JSON

    java">User user = new User("Charlie", 28);
    String jsonString = JSON.toJSONString(user);
    
  • JSON转对象

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

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

三、JSON的常见操作

1. 解析复杂的JSON结构

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

java">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

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

    java">Map<String, Object> map = new HashMap<>();
    map.put("name", "Alice");
    map.put("age", 25);
    String jsonString = objectMapper.writeValueAsString(map);
    
3. 处理日期和时间格式

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

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

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

java">ObjectMapper mapper = new ObjectMapper();
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));
4. 忽略字段

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

java">public class User {private String name;@JsonIgnoreprivate String password;// getters and setters
}

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

5. 获取Json数据中某个字段
java">    // 获取params里面的documentIdJsonNode 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博客


http://www.ppmy.cn/embedded/125669.html

相关文章

rabbitMq-----消费者管理模块

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言消费者字段消费者内存管理类新增/删除消费者 总的消费者管理类 前言 只有订阅客户端订阅了一个队列消息后&#xff0c;他才是一个消费者&#xff0c;而消费者存…

打破常规,BD仓储物流的效能提升!

当前&#xff0c;随着国家战略的推进&#xff0c;JS与民用领域的融合不断加深&#xff0c;物流业也步入了军民融合的新时代。在智能仓储物流方面&#xff0c;JS物流的智能化进展受到了BD系统的高度关注和重视。 一、建设JS仓储物流RFID基础设施 JS物流领域引入RFID技术的基础工…

238. 除自身以外数组的乘积

文章目录 1.题目2.思路3.代码 1.题目 238. 除自身以外数组的乘积 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32…

【Unity】版本不一致且未升级资产,导致 Unity Sprite 2D 动画播放错误

自己的 Unity版本是 2022.3.45f1。目前折腾的这插件 2D Action RPG Engine: Mythril2D &#xff0c;推荐使用的 Unity 版本是 2021.3.18。 倒腾了这个 unity animation 动画半天&#xff0c;发现这个 animation sprite resolver 在导入动画帧的时候&#xff0c;一直都导入的是…

netty详细说明ByteBuf的使用

一、ByteBuf的使用 ByteBuf是Netty提供的用于处理网络数据的字节缓冲区&#xff0c;具有以下特点和使用注意事项&#xff1a; 基本概念和特点 功能强大&#xff1a;Netty的ByteBuffer替代品&#xff0c;解决了JDK API的局限性&#xff0c;为网络应用程序开发者提供了更好的AP…

请求响应-08.响应-案例

一.案例 获取员工数据&#xff0c;返回统一响应结果&#xff0c;在页面上渲染展示 二.展示最终效果 三.步骤 步骤一&#xff1a; <dependency><groupId>org.dom4j</groupId><artifactId>dom4j</artifactId><version>2.1.3<…

从FastBEV来学习如何做PTQ以及量化

0. 简介 对于深度学习而言&#xff0c;通过模型加速来嵌入进C是非常有意义的&#xff0c;因为本身训练出来的pt文件其实效率比较低下&#xff0c;在讲完BEVDET后&#xff0c;这里我们将以CUDA-FastBEV作为例子&#xff0c;来向读者展示如何去跑CUDA版本的Fast-BEV&#xff0c;…

WSL2环境下Ubuntu的Docker安装与配置

检查是否存在安装残留&#xff0c;移除可能会造成冲突的组件。 for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done从apt Docker仓库中安装官方GPG key&#xff1a; sudo apt-get update …