超大JSON文件解析方案(Java)

解析超大JSON文件

1、需求

最近项目中需要将一个一个大于800M的JSON文件导出到Excel中,试过普通的按行读取文件和JSONReader流读取文件,由于JSON文件实在过于庞大,导致OOM问题

2、解决方案

每个json数组中包含的json对象太多,导致用流和按行读取时加载到内存会导致内存溢出。.

最终采用了JsonToken的解决方案。

package com.godfrey.poi.util;


import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.MappingJsonFactory;

import java.io.File;

/**
 * @author godfrey
 * @since 2021-12-05
 */
public class ParseJsonUtil {
    public static void main(String[] args) throws Exception {
        JsonFactory f = new MappingJsonFactory();
        JsonParser jp = f.createJsonParser(new File("F:/FeaturesToJSON.json"));
        JsonToken current;
        current = jp.nextToken();
        if (current != JsonToken.START_OBJECT) {
            System.out.println("Error: root should be object: quiting.");
            return;
        }
        while (jp.nextToken() != JsonToken.END_OBJECT) {
            String fieldName = jp.getCurrentName();
            // move from field name to field value
            current = jp.nextToken();
            if ("features".equals(fieldName)) {
                if (current == JsonToken.START_ARRAY) {
                    // For each of the records in the array
                    while (jp.nextToken() != JsonToken.END_ARRAY) {
                        // read the record into a tree model,
                        // this moves the parsing position to the end of it
                        JsonNode node = jp.readValueAsTree();
                        // And now we have random access to everything in the object
                        System.out.println("field1: " + node.get("field1").asText());
                        System.out.println("field2: " + node.get("field2").asText());
                    }
                } else {
                    System.out.println("Error: records should be an array: skipping.");
                    jp.skipChildren();
                }
            } else {
                System.out.println("Unprocessed property: " + fieldName);
                jp.skipChildren();
            }
        }
    }
}

代码中使用流和树模型解析的组合读取此文件。 每个单独的记录都以树形结构读取,但文件永远不会完整地读入内存,因此JVM内存不会爆炸。最终解决了读取超大文件的问题。

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: JSON文件格式字段可以使用不同的方法进行处理。如果你使用Java,你可以将JSON格式的字符串转换为JSONArray或JSONObject类型。如果是JSONArray,最外层是中括号,表示数组,格式为[{key:value},{key:value}...]或["str1","str2","str3",...]。你可以使用JSONArray.parseArray(strs)来将字符串转换为JSONArray对象。请注意,strs必须是以"[ ]"中括号开头结尾的JSON格式字符串,否则会报错。[1] 如果你使用Python,你可以使用json模块来处理JSON数据。在使用json模块解析JSON数据时,JSON数据的引号格式必须为双引号,否则会报错。你可以使用json.loads()函数将JSON字符串转换为Python对象。例如,你可以使用以下代码将CSV文件中的JSON数据转换为Python对象: ```python import pandas as pd import json data = pd.read_csv('data.csv') data['data'] = data.apply(lambda x: json.loads(x['data'].replace('\'','"')),axis=1) ``` 另外,你还可以使用demjson模块来解析JSON字符串。你可以使用pip install demjson命令安装demjson模块。类似于eval函数,你可以使用demjson.decode()函数将JSON字符串转换为Python对象。以下是使用demjson模块解析JSON字符串的示例代码: ```python import pandas as pd import demjson data = pd.read_csv('data.csv') data['data'] = data.apply(lambda x:demjson.decode(x['data']),axis=1) ``` 以上是处理JSON文件格式字段的几种解决方案。你可以根据自己的需求选择适合的方法进行处理。[2][3]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值