[Java]_[初级]_[使用fastjson以流的方式读取json大文件]

news/2025/3/26 16:05:12/

场景

  1. 开发JSON应用时,有时候需要从JSON文件里读取配置数据到内存。当JSON文件足够大时,如果先把文件读入内存再进行parse会浪费不必要的大文件连续内存。甚至可能会导致OOM, 这时候如果能像XML文件那样可以以流的方式读取结构化JSON数据,那么会节省很多内存。那么怎么做?

说明

  1. 开发jfinal框架的网站时,标配是fastjson-1.2.83版本,也就是fastjson 1的最高版本。如果不是特殊的用法,这个版本是够用且稳定的。

  2. JSON文件是UTF-8格式,一般可以用它来做多语言文字存储格式。 常用的可以通过以下方式解析指定的JSON格式。这种方式得先有内存的JSON格式, 这种方式需要预先读取.json文件所有内容到内存。

JSONObject object = JSONObject.parseObject(pageDataStr);
Object object = JSON.parse(pageDataStr);
  1. 还有就是fastjson提供了Stream API JSONReader,来按流的方式读取指定部分json对象,比如对象,数组,字符串,整数等。
JSONReader jr = new JSONReader(Reader)){
jr.startObject();
while(jr.hasNext()){String key = jr.readString();JSONObject value = (JSONObject) jr.readObject();...
}
jr.endObject();

例子

  1. 以下例子读取文件的json格式并存储在一个大JSONObject里
try(InputStream is = new FileInputStream(file);InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8);BufferedReader br = new BufferedReader(isr);JSONReader jr = new JSONReader(br)){JSONObject object = new JSONObject();// 明确知道`json`文件是以对象开始存储的。 {"name":"Peter"}jr.startObject();while(jr.hasNext()){String key = jr.readString();JSONObject value = (JSONObject) jr.readObject();object.put(key,value);}jr.endObject();data.put(localName,object);return true;
} catch (FileNotFoundException e) {log.error(e.getMessage());
} catch (IOException e) {log.error(e.getMessage());
}

json file

{"article": {"home":"首页","support_center":"支持中心","sales_faqs":"销售常见问题","refund_faqs":"退款常见问题","product_faqs":"产品常见问题","online_tutorials":"在线教程","product_center":"产品中心"}
}

参考

  1. FastJson 读取超大json文件引起OOM问题排查与解决

  2. fastjson 1

  3. Quick Start CN · alibaba/fastjson Wiki

  4. 常见问题 · alibaba/fastjson Wiki

  5. Stream api · alibaba/fastjson Wiki

  6. JSON最佳实践


http://www.ppmy.cn/news/1089471.html

相关文章

模型转换需要用到的一些基本层的定义

深度学习在计算机视觉等模式识别领域具有强大的能力,但是也遭遇内存占用大、部署环境不友好问题,这里打算写一个专栏,从模型转换到模型压缩,以期可以为深度学习的广泛使用做推广。 深度学习需要部署环境,但是这对硬件…

Error from server (NotFound): pods “nginx-57d84f57dc-b866m“ not found

原因:机房断电,导致服务重启 [rootmaster1 logs]# kubectl get pod NAME READY STATUS RESTARTS AGE nginx-57d84f57dc-57fkf 1/1 Running 0 75s [rootmaster1 logs]# kubectl logs -f nginx-5…

Java ArrayList类详解

基本定义 ArrayList 是 Java 中的一个动态数组数据结构,属于 Java 集合框架的一部分(java.util 包中的类)。它提供了一个基于数组的可变长度列表,允许你在运行时添加、删除和访问元素,而不需要提前指定数组的大小。 简…

【Vue3 知识第六讲】ref、 shallowRef、unref、isRef 等系列知识应用

文章目录 一、ref()二、shallowRef()三、 triggerRef()四、customRef()五、isRef()六、unref()七、ref 用于获取 DOM 元素补充:ref、toRef、toRefs 异同点 一、ref() ref() 方法接受一个内部值,返回一个响应式的、可更改的 ref 对象,此对象只…

关于在本地启动跨域非nodejs的前后端分离项目

目前的前后端分离,dev开发模式下,本地启动时会首先启动一个nodejs作为服务器,把本地网页启动起来,同时对后端的接口请求,可以经过proxy来实现,从而避免了浏览器的跨域检查。 但是有些陈旧的基于jquerylayu…

10个最强大的基于生成式AI的3D建模工具

推荐:用 NSDT编辑器 快速搭建可编程3D场景 在快速发展的技术世界中,人工智能 (AI) 已经改变了游戏规则,尤其是在 3D 对象生成领域。 AI 驱动的 3D 对象生成器彻底改变了我们创建和可视化 3D 模型的方式,使该过程更加高效、准确且可…

Revit SDK 介绍:CreateAirHandler 创建户式风管机

前言 这个例子介绍如何通过 API 创建一个户式风管机族的内容,包含几何和接头。 内容 效果 核心逻辑 必须打开机械设备的族模板创建几何实体来表示风管机创建风机的接头 创建几何实体来表示风管机 例子中创建了多个拉伸,下面仅截取一段代码&#xff…

归并排序学习

归并排序采用了分而治之的思想,所以主要分为“分”和“治”两部分 分:对数组取中点,分为两部分,两个子数组同理取中点,各自分为两部分…治:分到数组长度为 1 时自然就可以返回了,然后开始往上一…