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

news/2024/4/15 7:53:30

场景

  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 时自然就可以返回了,然后开始往上一…

在windows 安装JDK17 指南

一、下载jdk 去oracle官网下载jdk压缩包, 下载地址:https://www.oracle.com/java/technologies/downloads/#java17 二、解压jdk 将下载好的jdk压缩包,解压到要安装jdk的路径(不要有中文), 三、配置环…

leetcode弹簧板

题目描述 有一个小球掉落在一串连续的弹簧板上,小球落到某一个弹簧板后,会被弹到某一个地点,直到小球被弹到弹簧板以外的地方。 假设有 n 个连续的弹簧板,每个弹簧板占一个单位距离,a[i] 代表代表第 ii 个弹簧板会把小…

三步搭建个人网站并发布上线【内网穿透】

三步搭建个人网站并发布上线【内网穿透】 文章目录 三步搭建个人网站并发布上线【内网穿透】前言一、在本地电脑上制作一个网站二、使用WordPress建立网站三、通过cpolar建立的数据隧道发布到公网上 前言 在这个个性飞扬的时代,每个人都希望拥有表现自我的平台&…

springboot 集成 lucene

简介 数据每分钟产生200条,使用mysql储存。目前有数据超过700M。按照日期查询,按月查询包含每次超过20w条以上,时间比较长。计划使用lucene优化查询,不适用es是因为项目较小,没有更富裕的资源。 基本步骤 引入依赖。…

RK3588平台产测之ArmSoM-W3 DDR压力测试

1. 简介 RK3588从入门到精通 ArmSoM团队在产品量产之前都会对产品做几次专业化的功能测试以及性能压力测试,以此来保证产品的质量以及稳定性 优秀的产品都要进行多次全方位的功能测试以及性能压力测试才能够经得起市场的检验 2. 环境介绍 硬件环境: …

Android图形-架构1

目录 引言 Android图形的关键组件: Android图形的pipeline数据流 BufferQueue是啥? 引言 Android提供用于2D和3D图形渲染的API,可与制造商的驱动程序实现代码交互,下面梳理一下Android图形的运作原理。 应用开发者通过三种方…

YaRN: Efficient Context Window Extension of Large Language Models

本文是LLM系列文章,针对《YaRN: Efficient Context Window Extension of Large Language Models》的翻译。 YaRN:大型语言模型的有效上下文窗口扩展 摘要1 引言2 背景和相关工作3 方法4 实验5 结论 摘要 旋转位置嵌入(RoPE)已被…

echarts横向柱状图 双y轴滚动

滚动代码 dataZoom: [{width: 5,type: "slider",// type: "inside",show: true,yAxisIndex: [0, 1],showDataShadow: false,backgroundColor: "rgba(0,0,0,0)",borderWidth: 0,endValue: 5, //从0开始的相当于8个handleIcon:"path://M306.1…

使用Vue + axios实现图片上传,轻松又简单

目录 一、Vue框架介绍 二、Axios 介绍 三、实现图片上传 四、Java接收前端图片 一、Vue框架介绍 Vue是一款流行的用于构建用户界面的开源JavaScript框架。它被设计用于简化Web应用程序的开发,特别是单页面应用程序。 Vue具有轻量级、灵活和易学的特点&#xf…

windows 不能ping通虚拟机问题

先查看windows网卡 查看虚拟机种 对应VMnet8种的 nat (我用的是这种连接方式)设置 问题是不在同一个网段,修改windows VMnet8网卡的配置 保证网关、网段是一样的 现在ping问题解决,也能windows远程连接虚拟机

【腾讯云 Cloud Studio 实战训练营】使用python爬虫和数据可视化对比“泸州老窖和五粮液4年内股票变化”

Cloud Studio 简介 Cloud Studio是腾讯云发布的云端开发者工具,支持开发者利用Web IDE(集成开发环境),实现远程协作开发和应用部署。 现在的Cloud Studio已经全面支持Java Spring Boot、Python、Node.js等多种开发模板示例库&am…

Cyber RT学习笔记

Cyber RT学习笔记 1.Cyber RT框架基础介绍 2.Cyber RT基础概念汇总 3.Cyber RT的安装与入门实践 4.Cyber RT的基础库 5.Cyber RT通信机制解析与实践 6.Scheduler调度器与Task任务 7.Component组件认知与实践 8.Coroutine协程相关
最新文章