JAVA JSON流式解析

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

pom.xml依赖   


    com.alibaba
    fastjson
    1.2.47

代码

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();
    }
}

你可能感兴趣的:(java后端,java微服务,代码优化)