如何解析一个巨大的 JSON 文件而不将其加载到内存中

2024-04-01

我有一个很大的 JSON 文件 (2.5MB),包含大约 80000 行。

它看起来像这样:

{
  "a": 123,
  "b": 0.26,
  "c": [HUGE irrelevant object],
  "d": 32
}

我只想为键存储整数值a, b and d并忽略 JSON 的其余部分(即忽略 JSON 中的任何内容)c value).

我无法修改原始 JSON,因为它是由第三方服务创建的,我从其服务器下载该服务。

如何在不将整个文件加载到内存中的情况下执行此操作?

我尝试使用gson https://github.com/google/gson库并创建了这样的 bean:

public class MyJsonBean {
  @SerializedName("a")
  @Expose
  public Integer a;

  @SerializedName("b")
  @Expose
  public Double b;

  @SerializedName("d")
  @Expose
  public Integer d;
}

但即便如此,为了使用 Gson 反序列化它,我需要先下载并读取内存中的整个文件,然后将其作为字符串传递给 Gson?

File myFile = new File(<FILENAME>);
myFile.createNewFile();

URL url = new URL(<URL>);
OutputStream out = new BufferedOutputStream(new FileOutputStream(myFile));
URLConnection conn = url.openConnection();

HttpURLConnection httpConn = (HttpURLConnection) conn;

InputStream in = conn.getInputStream();
byte[] buffer = new byte[1024];

int numRead;
while ((numRead = in.read(buffer)) != -1) {
  out.write(buffer, 0, numRead);
}

FileInputStream fis = new FileInputStream(myFile);
byte[] data = new byte[(int) myFile.length()];
fis.read(data);
String str = new String(data, "UTF-8");

Gson gson = new Gson();
MyJsonBean response = gson.fromJson(str, MyJsonBean.class);

System.out.println("a: " + response.a + "" + response.b + "" + response.d);

有什么方法可以避免加载整个文件并只获取我需要的相关值?


您绝对应该检查不同的方法和库。如果您真的关心性能检查:Gson, Jackson https://github.com/FasterXML/jackson-databind and JsonPath https://github.com/json-path/JsonPath库来做到这一点并选择最快的一个。当然你必须加载整个JSON文件可能在本地磁盘上TMP文件夹并在之后解析它。

Simple JsonPath解决方案可能如下所示:

import com.jayway.jsonpath.DocumentContext;
import com.jayway.jsonpath.JsonPath;

import java.io.File;

public class JsonPathApp {
    public static void main(String[] args) throws Exception {
        File jsonFile = new File("./resource/test.json").getAbsoluteFile();

        DocumentContext documentContext = JsonPath.parse(jsonFile);
        System.out.println("" + documentContext.read("$.a"));
        System.out.println("" + documentContext.read("$.b"));
        System.out.println("" + documentContext.read("$.d"));
    }
}

请注意,我没有创建任何POJO,只需使用读取给定值JSONPath特征类似于XPath。你可以做同样的事情Jackson:

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.File;

public class JsonPathApp {
    public static void main(String[] args) throws Exception {
        File jsonFile = new File("./resource/test.json").getAbsoluteFile();

        ObjectMapper mapper = new ObjectMapper();
        JsonNode root = mapper.readTree(jsonFile);
        System.out.println(root.get("a"));
        System.out.println(root.get("b"));
        System.out.println(root.get("d"));
    }
}

我们不需要JSONPath因为我们需要的值直接在root节点。如你看到的,API看起来几乎一样。我们还可以创建POJO结构:

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.File;
import java.math.BigDecimal;

public class JsonPathApp {
    public static void main(String[] args) throws Exception {
        File jsonFile = new File("./resource/test.json").getAbsoluteFile();

        ObjectMapper mapper = new ObjectMapper();
        Pojo pojo = mapper.readValue(jsonFile, Pojo.class);
        System.out.println(pojo);
    }
}

@JsonIgnoreProperties(ignoreUnknown = true)
class Pojo {
    private Integer a;
    private BigDecimal b;
    private Integer d;

    // getters, setters
}

即便如此,两个库都允许读取JSON有效负载直接来​​自URL我建议使用您能找到的最佳方法在另一个步骤中下载它。欲了解更多信息,请阅读这篇文章:从 Java 中的 URL 下载文件 https://www.baeldung.com/java-download-file.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何解析一个巨大的 JSON 文件而不将其加载到内存中 的相关文章

  • Java:在 eclipse 中导出到 .jar 文件

    我正在尝试将 Eclipse 中的程序导出到 jar 文件 在我的项目中 我添加了一些图片和 PDF s 当我导出到 jar 文件时 似乎只有main已编译并导出 我的意愿是如果可能的话将所有内容导出到 jar 文件 因为这样我想将其转换为
  • org.hibernate.QueryException:无法解析属性:文件名

    我正在使用休眠Criteria从列中获取值filename在我的桌子上contaque recording log 但是当我得到结果时 它抛出异常 org hibernate QueryException 无法解析属性 文件名 com co
  • Integer.parseInt("0x1F60A") 以 NumberformatException 结束

    我尝试从数据库中获取长字符串内的表情符号代码 格式如下 0x1F60A 所以我可以访问代码 但它将是String 起初 我尝试通过执行以下操作来转换变量tv setText beforeEmo getEmijoByUnicode int e
  • 大数据使用什么数据结构

    我有一个包含一百万行的 Excel 工作表 每行有 100 列 每行代表一个具有 100 个属性的类的实例 列值是这些属性的值 哪种数据结构最适合在这里使用来存储数百万个数据实例 Thanks 这实际上取决于您需要如何访问这些数据以及您想要
  • 如何根据运行的 jar 的结果让我的 ant 任务通过或失败?

    我正在运行 CrossCheck 无浏览器 js 单元测试 作为 ant 脚本的一部分 如果 CrossCheck 测试失败 我希望 ant 报告失败 这是 build xml 中的相关部分
  • 来自十六进制代码的 Apache POI XSSFColor

    我想将单元格的前景色设置为十六进制代码中的给定颜色 例如 当我尝试将其设置为红色时 style setFillForegroundColor new XSSFColor Color decode FF0000 getIndexed 无论我在
  • ConcurrentHashMap 内部是如何工作的?

    我正在阅读有关 Java 并发性的 Oracle 官方文档 我想知道Collection由返回 public static
  • 生成的序列以 1 开头,而不是注释中设置的 1000

    我想请求一些有关 Hibernate 创建的数据库序列的帮助 我有这个注释 下面的代码 在我的实体类中 以便为合作伙伴表提供单独的序列 我希望序列以 1000 开头 因为我在部署期间使用 import sql 将测试数据插入数据库 并且我希
  • 内部存储的安全性如何?

    我需要的 对于 Android 我需要永久保存数据 但也能够编辑 并且显然是读取 它 用户不应访问此数据 它可以包含诸如高分之类的内容 用户不得对其进行编辑 我的问题 我会 并且已经 使用过Internal Storage 但我不确定它实际
  • 使用 Mockito 模拟某些方法,但不模拟其他方法

    有没有办法使用 Mockito 模拟类中的某些方法 而不模拟其他方法 例如 在这个 诚然是人为的 Stock我想嘲笑的班级getPrice and getQuantity 返回值 如下面的测试片段所示 但我想要getValue 执行乘法 如
  • 流中的非终结符 forEach() ?

    有时 在处理 Java Stream 时 我发现自己需要一个非终端 forEach 来触发副作用但不终止处理 我怀疑我可以用 map item gt f item 之类的方法来做到这一点 其中方法 f 执行副作用并将项目返回到流中 但这似乎
  • HashMap 值需要不可变吗?

    我知道 HashMap 中的键需要是不可变的 或者至少确保它们的哈希码 hashCode 不会改变或与另一个具有不同状态的对象发生冲突 但是 HashMap中存储的值是否需要与上面相同 为什么或者为什么不 这个想法是能够改变值 例如在其上调
  • 在 SWT/JFace RCP 应用程序中填充巨大的表

    您将如何在 SWT 表中显示大量行 巨大是指超过 20K 行 20 列的东西 不要问我为什么需要展示那么多数据 这不是重点 关键是如何让它尽可能快地工作 这样最终用户就不会厌倦等待 每行显示某个对象的实例 列是其属性 一些 我想使用 JFa
  • QuerySyntaxException:无法找到类

    我正在使用 hql 生成 JunctionManagementListDto 类的实际 Java 对象 但我最终在控制台上出现以下异常 org hibernate hql internal ast QuerySyntaxException
  • java库维护数据库结构

    我的应用程序一直在开发 所以偶尔 当版本升级时 需要创建 更改 删除一些表 修改一些数据等 通常需要执行一些sql代码 是否有一个 Java 库可用于使我的数据库结构保持最新 通过分析类似 db structure version 信息并执
  • 是否可以使用 Java Guava 将函数应用于集合?

    我想使用 Guava 将函数应用于集合 地图等 基本上 我需要调整 a 的行和列的大小Table分别使所有行和列的大小相同 执行如下操作 Table
  • Kubernetes / kubectl - “必须指定容器名称”,但看起来确实如此?

    我正在调试 kubectl 的日志输出 其中指出 Error from server BadRequest a container name must be specified for pod postgres operator 49202
  • 使用按钮作为列表的渲染器

    我想使用一个更复杂的渲染器 其中包含列表的多个组件 更准确地说 类似于this https stackoverflow com questions 10840498 java swing 1 6 textinput like firefox
  • OpenCSV:将嵌套 Bean 映射到 CSV 文件

    我正在尝试将 bean 映射到 CSV 文件 但问题是我的 bean 具有其他嵌套 bean 作为属性 所发生的情况是 OpenCSV 遍历属性找到一个 bean 然后进入其中并映射该 bean 内的所有数据 如果找到另一个 bean 它就
  • Spring表单ModelAttribute字段验证避免400 Bad Request错误

    我有一个ArticleFormModel包含正常发送的数据html form由 Spring 使用注入 ModelAttribute注释 即 RequestMapping value edit method RequestMethod PO

随机推荐

  • 将 html 内容从 iframe 复制到 div ( ajax )?

    假设我的浏览器加载了一个 Iframe 我可以使用ajax将test html的内容加载到html主页面的div中吗 这个想法是我的解决方案 因为我实际上正在尝试克服将 ajax 提交到远程主机的限制 该计划是生成具有 0 大小 ifram
  • C++ 多态性:从父类到子类[重复]

    这个问题在这里已经有答案了 在C 中 我们可以将子类指针转换为父类 但是有没有办法将其转换回来 从父类 从子类获得 返回子类 I mean class Parent class Child public Parent int main in
  • 根据其父级的高度设置宽度

    全球性问题 我想根据父元素的高度设置元素的宽度 我知道你可以使用padding top根据父级的宽度设置高度 也许有人知道我的情况的技巧 一个可能的解决方案 技巧 全球性问题将设置height 100 到元素 然后rotate 90deg
  • 在 D3.js v4 中使用轴过渡包裹长标签

    这是原来的例子 https bl ocks org mbostock 7555321 https bl ocks org mbostock 7555321 我向 x 轴添加了过渡 并制作了两个小提琴来演示以下事实 使用过渡在轴上包裹长标签在
  • HTML2Canvas 在 Ionic4 角度项目中生成空白图像。控制台中没有错误。相同的代码在纯 html/javascript 中生成正确的图像

    我在 Ionic4 角度测试项目中安装了 html2canvas 并将其导入到 home page ts 中 我有一个普通的 100px X 100px 黄色背景 div 带有一行文本 我将此 div 传递给 html2canvas 以下载
  • 如何获取 ClojureScript 中正则表达式匹配的位置?

    在 Clojure 中我可以使用类似这样的解决方案 用于正则表达式匹配及其在字符串中的位置的紧凑 Clojure 代码 https stackoverflow com questions 3262195 compact clojure co
  • Android 弹出列表视图

    我想在我的 Android 应用程序中实现一个功能 例如当用户单击标题中的按钮时 会弹出一个小列表视图 在屏幕一角有 5 个值 请大家给点建议 很紧急 提前致谢 You mean a quick action menu Like this
  • 如何在 Airflow 中使用 HashiCorp Vault?

    我开始使用 Apache Airflow 我想知道如何有效地使其使用存储在 Vault 中的秘密和密码 不幸的是 搜索不会返回超出范围的有意义的答案Airflow 中尚未实现的钩子 https issues apache org jira
  • MySQL 访问被拒绝 1045 错误

    我收到一个非常奇怪的错误 我使用以下凭据创建了一个用户 testuser CREATE USER testuser IDENTIFIED BY 123456 GRANT ALL PRIVILEGES ON TO testuser FLUSH
  • 设计 - 从两个模型登录

    我有两个用户模型 第一个是来自远程数据库作为遗留和用于公司内部目的 员工登录 第二个是我们的公共注册和登录项目 但我想要一张登录表单 我搜索了很长时间 但有些解决方案让我感到困惑 第一个遗产看起来像 仅用于读取和身份验证 class Crm
  • 存储过程不返回数据

    我正在将脚本从 已停产的 Windows 服务器传输到我们的 Linux 服务器 我需要传输的脚本之一是与MSSQL 服务器 与服务器的连接已建立 我可以从任何表中获取 常规 数据 但是当我执行存储过程时 我没有收到任何所需的数据 程序只是
  • 打字稿中的 this 关键字。这是一个错误吗?

    我有一个成员函数 render 该函数调用类的另一个成员add any 这是片段 render collection each this add 如果我在add中使用关键字 this 则类型是window 我希望它是成员类的实例 在构造函数
  • 如何使某些 JavaFX TreeView 节点不可选择?

    我想在我的 JavaFX 中创建 文件夹 节点TreeView可展开和折叠但是不可选择 I found 这次讨论 https community oracle com thread 2346878并调查了EventFilter 但似乎没有任
  • 在 UISearchController iOS 11 上使用背景图片

    我正在实施一个UISearchController to my UITableView但我在 iOS 11 的定制方面遇到了困难 我的导航栏使用渐变图像背景 我希望搜索控制器能够匹配它 但我还没有找到设置背景图像的方法UISearchCon
  • 如何使用 AJAX 接收 JSON 文件并使用 javascript 解析它?

    我正在尝试解析 foursquare 给我的这个又长又复杂的 JSON 这是我的 AJAX 请求 ajax url https api foursquare com v2 venues explore dataType json data
  • 通用2D游戏资产和绝对节点定位

    我有一个关于通用游戏资产 and 绝对定位 of a SKNodes in Sprite Kit iOS 8 我将尝试通过如下示例来展示我的问题 想象一个2D自上而下游戏 with a SKSpriteNode它代表一座房子 一个房子有多个
  • 从我的应用程序发送电子邮件时如何避免延迟?

    我有一个小型控制台应用程序 它检查一些设置 做出一些决定 然后发送电子邮件 问题是 在我的申请完成之前 电子邮件实际上并未发送 我希望发送电子邮件的方法完成后立即发送电子邮件 最初 我只是创建了一个 MailMessage 并调用 Send
  • Caliburn.Micro 在 WPF 中拖放文件

    我已经使用 Caliburn Micro 2 0 1 创建了桌面应用程序 现在我需要添加拖放行为 用户将从 Windows 资源管理器中拖动文件 我需要获取它的路径 但是我正在搜索两天了 我没有找到任何关于如何为 Caliburn Micr
  • JPA 关系映射概念

    我有几个关于双向映射的问题 我有这些实体 员工 1 1 Parking Lot 员工 1 部门 员工 1 项目 上述关系的源实体和目标实体是什么 业主有何用ManyToOne关系 我想知道楼主是 多个实体还是一个实体 Do mappedBy
  • 如何解析一个巨大的 JSON 文件而不将其加载到内存中

    我有一个很大的 JSON 文件 2 5MB 包含大约 80000 行 它看起来像这样 a 123 b 0 26 c HUGE irrelevant object d 32 我只想为键存储整数值a b and d并忽略 JSON 的其余部分