news 2026/6/11 4:40:37

SpringBoot进阶教程(八十七)数据压缩

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SpringBoot进阶教程(八十七)数据压缩

拆分JSON字符串​

1.1按结构拆分​

数组拆分​​:若JSON包含大型数组,可将其拆分为多个小数组。

复制代码

// 示例:将大数组拆分为多个子数组

JSONArray bigArray = new JSONArray(jsonString);

int chunkSize = 100;

for (int i = 0; i < bigArray.length(); i += chunkSize) {

JSONArray chunk = new JSONArray();

for (int j = i; j < Math.min(i + chunkSize, bigArray.length()); j++) {

chunk.put(bigArray.get(j));

}

String chunkJson = chunk.toString();

// 处理或保存chunkJson

}

复制代码

​​对象拆分​​:若JSON是嵌套对象,可按层级拆分为子对象。

1.2按大小拆分(流式处理)​​

使用流式API(如Jackson的JsonParser)逐块读取JSON内容,避免一次性加载到内存:

JsonFactory factory = new JsonFactory();

try (JsonParser parser = factory.createParser(new File("large.json"))) {

while (parser.nextToken() != null) {

// 逐Token处理,如按特定条件拆分

}

}

回到顶部

v压缩JSON字符串​

2.1使用GZIP压缩​

复制代码

import java.util.zip.GZIPOutputStream;

import java.io.ByteArrayOutputStream;

public static byte[] compress(String data) throws IOException {

ByteArrayOutputStream bos = new ByteArrayOutputStream(data.length());

try (GZIPOutputStream gzip = new GZIPOutputStream(bos)) {

gzip.write(data.getBytes());

}

return bos.toByteArray();

}

// 压缩后的数据可用于传输或存储

byte[] compressed = compress(jsonString);

复制代码

2.2使用Deflater压缩​

复制代码

import java.util.zip.Deflater;

public static byte[] deflateCompress(String data) {

Deflater deflater = new Deflater();

deflater.setInput(data.getBytes());

deflater.finish();

byte[] buffer = new byte[1024];

ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

while (!deflater.finished()) {

int count = deflater.deflate(buffer);

outputStream.write(buffer, 0, count);

}

deflater.end();

return outputStream.toByteArray();

}

复制代码

回到顶部

v优化JSON体积​​

3.1移除无用空格​

使用紧凑格式(无缩进、换行):

new JSONObject(jsonString).toString(); // 默认紧凑格式

3.2​​缩短键名​

将长字段名替换为短名称:

{"n":"Alice","a":30} // 原始键名可能为"name"、"age"

回到顶部

v流式处理大型JSON​​

使用流式API逐步解析,避免内存溢出:

复制代码

// Jackson流式API示例

JsonFactory factory = new JsonFactory();

try (JsonParser parser = factory.createParser(new File("large.json"))) {

JsonToken token;

while ((token = parser.nextToken()) != null) {

if (token == JsonToken.START_ARRAY) {

while (parser.nextToken() != JsonToken.END_ARRAY) {

// 逐条处理数组元素

JsonNode node = parser.readValueAsTree();

// 处理node...

}

}

}

}

复制代码

回到顶部

v分页处理​

其实也是拆分,将数据拆成若干份

回到顶部

v实践方案

复制代码

import com.fasterxml.jackson.databind.JsonNode;

import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.ByteArrayInputStream;

import java.io.ByteArrayOutputStream;

import java.io.IOException;

import java.util.zip.GZIPInputStream;

import java.util.zip.GZIPOutputStream;

import org.apache.commons.codec.binary.Base64;

import java.nio.charset.StandardCharsets;

public class CompressHelper {

private static final ObjectMapper objectMapper = new ObjectMapper();

/**

* 方式1:去除JSON中的空格/换行等冗余字符(文本压缩)

* @param formattedJson 格式化的JSON字符串(含空格换行)

* @return 紧凑格式的JSON字符串

* @throws IOException JSON解析异常

*/

public static String compressJsonByRemovingSpaces(String formattedJson) throws IOException {

JsonNode jsonNode = objectMapper.readTree(formattedJson);

return objectMapper.writeValueAsString(jsonNode);

}

/**

* 方式2:使用GZIP算法对JSON字符串进行二进制压缩(适合网络传输)

* @param json 原始JSON字符串

* @return Base64编码的压缩后字符串(可直接传输)

* @throws IOException 压缩异常

*/

public static String compressJsonByGzip(String json) throws IOException {

try (ByteArrayOutputStream byteOut = new ByteArrayOutputStream();

GZIPOutputStream gzipOut = new GZIPOutputStream(byteOut)) {

gzipOut.write(json.getBytes("UTF-8"));

gzipOut.finish();

return Base64.encodeBase64String(byteOut.toByteArray());

}

}

public static String decompressJson(String source) throws IOException {

byte[] compressedData = Base64.decodeBase64(source);

try (ByteArrayInputStream byteIn = new ByteArrayInputStream(compressedData);

GZIPInputStream gzipIn = new GZIPInputStream(byteIn);

ByteArrayOutputStream byteOut = new ByteArrayOutputStream()) {

// 读取压缩数据并解压缩

byte[] buffer = new byte[1024];

int len;

while ((len = gzipIn.read(buffer)) != -1) {

byteOut.write(buffer, 0, len);

}

return byteOut.toString(StandardCharsets.UTF_8.name());

}

}

}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 10:59:07

3步搞定Monaco Editor智能代码补全:从零配置到高级语言服务

3步搞定Monaco Editor智能代码补全&#xff1a;从零配置到高级语言服务 【免费下载链接】monaco-editor A browser based code editor 项目地址: https://gitcode.com/gh_mirrors/mo/monaco-editor 你是否在集成Monaco Editor时遇到过智能提示不工作、代码补全功能缺失的…

作者头像 李华
网站建设 2026/6/10 21:00:32

腾讯混元重磅出击:130亿参数视频模型如何改写AI创作格局?

腾讯混元重磅出击&#xff1a;130亿参数视频模型如何改写AI创作格局&#xff1f; 【免费下载链接】HunyuanVideo 项目地址: https://ai.gitcode.com/hf_mirrors/tencent/HunyuanVideo 在文生视频技术风起云涌的2024年末&#xff0c;中国AI领域迎来了一枚重磅炸弹。腾讯…

作者头像 李华
网站建设 2026/6/10 10:59:10

Qwen3-4B-FP8模型本地部署:零门槛极简实战指南

Qwen3-4B-FP8模型本地部署&#xff1a;零门槛极简实战指南 【免费下载链接】Qwen3-4B-Instruct-2507-FP8 项目地址: https://ai.gitcode.com/hf_mirrors/Qwen/Qwen3-4B-Instruct-2507-FP8 还在为复杂的AI模型部署流程头疼吗&#xff1f;作为技术爱好者&#xff0c;你是…

作者头像 李华
网站建设 2026/6/10 10:59:07

3D打印速度优化终极指南:层高线宽最佳配比黄金法则

3D打印速度优化终极指南&#xff1a;层高线宽最佳配比黄金法则 【免费下载链接】OrcaSlicer G-code generator for 3D printers (Bambu, Prusa, Voron, VzBot, RatRig, Creality, etc.) 项目地址: https://gitcode.com/GitHub_Trending/orc/OrcaSlicer 让我们一起来探索…

作者头像 李华
网站建设 2026/6/10 10:56:28

终极指南:MenuMeters - 实时监控你的macOS系统性能

在当今数字化工作环境中&#xff0c;macOS系统监控已成为每个Mac用户必备的技能。无论是追踪CPU使用率、内存占用&#xff0c;还是监控磁盘读写活动&#xff0c;一个直观易用的工具能让你对系统状态了如指掌。今天&#xff0c;我们将深入介绍MenuMeters这款经典的菜单栏性能工具…

作者头像 李华
网站建设 2026/6/10 19:46:47

程序员兼职:高效拓展收入与技术能力的现实路径

随着远程办公、灵活用工逐渐成为趋势&#xff0c;程序员兼职正在成为许多开发者提高收入、积累项目经验、探索更多职业路线的现实选择。不同于传统的固定工作&#xff0c;兼职项目更自由&#xff0c;但同时也带来了更高的信息不对称与执行压力。 为了帮助想进入程序员兼职市场的…

作者头像 李华