-
Notifications
You must be signed in to change notification settings - Fork 4
3.JSONReader
wycst edited this page Nov 16, 2024
·
1 revision
// 1.从流读取
final JSONReader reader1 = JSONReader.from(JSONReaderExample.class.getResourceAsStream("/json/path.json"));
Map map = (Map) reader1.read(); // 或者使用readAsResult转化为指定类型
System.out.println(map);
// 2.从文件读取
final JSONReader reader2 = JSONReader.from(new File("e:/tmp/test.json"));
Map map2 = (Map) reader2.read();
System.out.println(map2);
只对需要的数据进行提取,能大大节省运行内存.
final JSONReader reader1 = JSONReader.from(JSONReaderExample.class.getResourceAsStream("/json/path.json"));
// 支持正则表达式, 这里根据路径匹配到/store/book/1
JSONReaderHook readerHook = JSONReaderHook.regularPath("/store/book/1");
reader1.read(readerHook);
List<Object> results = readerHook.getResults();
System.out.println(results);
假设待读取的流内容巨大时,支持将需要提取的内容获取到结束读取解析,既能节省内存,还能非常显著的提高效率。
final JSONReader reader = JSONReader.from(JSONReaderExample.class.getResourceAsStream("/json/path.json"));
// 1.使用内置的短路实现获取路径对象
JSONReaderHook readerHook = JSONReaderHook.exactPath("/store/book/1");
reader.read(readerHook);
List<Object> results = readerHook.getResults();
System.out.println(results);
// 2.自定义短路实现获取某个叶子节点后短路退出,此种方式更灵活;
JSONReaderHook readerHook2 = new JSONReaderHook() {
@Override
protected void parseValue(String key, Object value, Object host, int elementIndex, String path, int type) throws Exception {
if ("/store/book/1/author".equals(path)) {
results.add(value);
// 获取到author后中断退出
abort();
}
}
};
final JSONReader reader2 = JSONReader.from(JSONReaderExample.class.getResourceAsStream("/json/path.json"));
reader2.read(readerHook2);
System.out.println(readerHook2.getResults());
final JSONReader reader = JSONReader.from(JSONReaderExample.class.getResourceAsStream("/json/path.json"));
reader.read(true);
final JSONReader reader2 = JSONReader.from(JSONReaderExample.class.getResourceAsStream("/json/path.json"));
reader2.read(true);
// 也可以自定义hook,在onCompleted中完成业务处理
final JSONReader reader3 = JSONReader.from(JSONReaderExample.class.getResourceAsStream("/json/path.json"));
reader3.read(new JSONReaderHookDefault() {
@Override
protected void onCompleted(Object result) {
System.out.println("async onCompleted " + result);
}
}, true);
// 这里可以继续并行的处理其他业务
// 两个读取任务基本上是同时完成的
System.out.println("reader result1:" + reader.getResult());
System.out.println(System.currentTimeMillis());
System.out.println("reader result2:" + reader2.getResult());
System.out.println(System.currentTimeMillis());
// 示例文件共10个json
InputStream is = JSONReaderTest.class.getResourceAsStream("/json/multiple_jsons.txt");
JSONReader jsonReader = new JSONReader(is);
jsonReader.setMultiple(true);
// 通过skipNext可以跳过指定的json数据
jsonReader.skipNext(5);
Object obj = null;
while ((obj = jsonReader.read()) != null) {
System.out.println(obj);
}
// 注意最后需要手动关闭流
jsonReader.close();