一次传入超大的JSON的数据(比如1G数据)到一个方法的内部,进行解析处理,很容易发生内存溢出,fastjson能流式的解析数据,比如1G的数据在获取传入方法内部之前先获取这1G的流,即每次只读取一点数据,依次去解析他的key-value,解析得到单个key:value之后,只将单个key:value传入方法内部,使用while循环读取流中的数据,读取一次传入方法解析,解析完成之后再读取流的下一个位置的数据,因为这样调用解析这个方法一次之后,方法内部的内存数据会被标记为可回收状态,下一次GC会回收资源,所以程序占用的内存很小,可以解决内存溢出问题
依赖 <fastjson版本可根据需求设置,这里使用的是1.2.47>
<dependency>
<groupId></groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
代码
import ;
import .*;
/**
* 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);//传入流
();//相当于开始读整个json的Object对象。
while (()) {//是否有下一个对象 {}
Object jsonOne = ();
//处理单个JSON对象内容 {}.这里可以再一次使用流式解析analysisObject,解析单个对象
(jsonOne);
}
();//结束读取
();//关闭reader流
}
/**
* 按照JSON对象的方式解析
* 数据示例: {"k1":"v1","k2":"v2"}
*/
public static void analysisObject(Reader reader) {
JSONReader jsonObject = new JSONReader(reader);//传入流
();//相当于开始读整个json的Object对象。
while (()) {//是否有下一个k-v值
Object key = ();//获取key
Object value = ();//获取value
(key + ":" + value);//处理kv值
}
();//结束读取
();//关闭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);
();//注意关闭流
();
}
}