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


    场景

    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
    • 2
    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    例子

    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());
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    json file

    {
      "article": {
        "home":"首页",
        "support_center":"支持中心",
        "sales_faqs":"销售常见问题",
        "refund_faqs":"退款常见问题",
        "product_faqs":"产品常见问题",
        "online_tutorials":"在线教程",
        "product_center":"产品中心"
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    参考

    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最佳实践

  • 相关阅读:
    react-query(@tanstack/react-query)使用
    VSSM VMamba实现
    MAC 机器上 Python 程序打包
    力扣:88. 合并两个有序数组(Python3)
    java毕业设计房地产管理系统登录Mybatis+系统+数据库+调试部署
    构建高效的接口自动化测试框架思路
    并发编程-线程池底层原理
    【CSS】深入了解圆角属性border-radius
    Excel表格的函数和必学的五个小技巧
    红队框架列表
  • 原文地址:https://blog.csdn.net/infoworld/article/details/132635629