首页 前端知识 [Java]_[初级]_[使用fastjson以流的方式读取json大文件]

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

2024-04-29 11:04:57 前端知识 前端哥 481 258 我要收藏

场景

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

转载请注明出处或者链接地址:https://www.qianduange.cn//article/6233.html
评论
发布的文章

JQuery中的load()、$

2024-05-10 08:05:15

大家推荐的文章
会员中心 联系我 留言建议 回顶部
复制成功!