JAVA JSON流式解析

一次传入超大的JSON的数据(比如1G数据)到一个方法的内部,进行解析处理,很容易发生内存溢出,fastjson能流式的解析数据,比如1G的数据在获取传入方法内部之前先获取这1G的流,即每次只读取一点数据,依次去解析他的key-value,解析得到单个key:value之后,只将单个key:value传入方法内部,使用while循环读取流中的数据,读取一次传入方法解析,解析完成之后再读取流的下一个位置的数据,因为这样调用解析这个方法一次之后,方法内部的内存数据会被标记为可回收状态,下一次GC会回收资源,所以程序占用的内存很小,可以解决内存溢出问题

pom.xml依赖   <fastjson版本可根据需求设置,这里使用的是1.2.47>

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.47</version>
</dependency>

代码

import com.alibaba.fastjson.JSONReader;

import java.io.*;

/**
 * JAVA Json流式解析
 */
public class Stream {
    /**
     * 将字符串转化为Reader流
     * 这一种方式只是用于演示功能,因为整个字符串会加载在内存中,并不能降低内存消耗
     *
     * @return
     */
    public static Reader getStringReader(String jsonString) {
        Reader reader = new StringReader(jsonString);//转化为流
        return reader;
    }

    /**
     * 获取文件Reader流,推荐这一种方式
     *
     * @param pathFile json文件路径
     * @return
     */
    public static Reader getFileReader(String pathFile) throws FileNotFoundException {
        Reader reader = new FileReader(pathFile);//转化为流
        return reader;
    }

    /**
     * 获取其它Reader流,推荐http响应流等等
     *
     * @param inputStream 流
     * @return
     */
    public static Reader getHttpResponseReader(InputStream inputStream) {
        Reader reader = new InputStreamReader(inputStream);
        return reader;
    }

    /**
     * 按照JSON数组的方式解析
     * 数据示例: [{},{}]
     */
    public static void analysisArray(Reader reader) {
        JSONReader jsonArray = new JSONReader(reader);//传入流
        jsonArray.startArray();//相当于开始读整个json的Object对象。
        while (jsonArray.hasNext()) {//是否有下一个对象 {}
            Object jsonOne = jsonArray.readObject();
            //处理单个JSON对象内容 {}.这里可以再一次使用流式解析analysisObject,解析单个对象
            System.out.println(jsonOne);
        }
        jsonArray.endArray();//结束读取
        jsonArray.close();//关闭reader流
    }

    /**
     * 按照JSON对象的方式解析
     * 数据示例: {"k1":"v1","k2":"v2"}
     */
    public static void analysisObject(Reader reader) {
        JSONReader jsonObject = new JSONReader(reader);//传入流
        jsonObject.startObject();//相当于开始读整个json的Object对象。
        while (jsonObject.hasNext()) {//是否有下一个k-v值
            Object key = jsonObject.readObject();//获取key
            Object value = jsonObject.readObject();//获取value
            System.out.println(key + ":" + value);//处理kv值
        }
        jsonObject.endObject();//结束读取
        jsonObject.close();//关闭reader流
    }

    /**
     * 测试用例
     *
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {
        //类型1
        String jsonStr = "{\"result\":[{\"name\":\"周瑜\",\"age\":13,\"hb\":114},{\"name\":\"黄盖\",\"age\":15,\"amt\":132}],\"message\":\"获取数据\",\"sum\":\"2\"}";
        Reader reader = getStringReader(jsonStr);
        analysisObject(reader);
        //类型2
        String jsonStrArray = "[{\"name\":\"周瑜\",\"age\":13,\"hb\":114},{\"name\":\"黄盖\",\"age\":15,\"amt\":132}]";
        Reader readerArray = getStringReader(jsonStrArray);
        analysisArray(readerArray);
        reader.close();//注意关闭流
        readerArray.close();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小钻风巡山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值