Java首先读取大型JSON文件的结束节点
我有一个大约65MB的大JSON文件,格式如下Java首先读取大型JSON文件的结束节点,java,json,java-8,jackson,Java,Json,Java 8,Jackson,我有一个大约65MB的大JSON文件,格式如下 { "Root Node": { "Node1": { "Node1.1": [{ "logLevel":"INFO" "count" : 20 },{ "logLevel":"DEBUG" "count" : 200 },{ "logLevel":"ERROR"
{
"Root Node": {
"Node1": {
"Node1.1": [{
"logLevel":"INFO"
"count" : 20
},{
"logLevel":"DEBUG"
"count" : 200
},{
"logLevel":"ERROR"
"count" : 2000
}],
"Node1.2": "",
"Node1.3": {
"fromDate": "2014-11-11T14:59:59",
"toDate": "2014-11-11T14:00:00"
}
}
}
}
我正在使用Jackson解析要读取节点1.3的大文件
然后读取Node1.1并创建一个POJO对象,该对象将包含Node1.1数组中的所有数据,并且fromDate和toDate将与每个数据相关联。如果我按顺序进行,我可以解析文件,但是节点1.3在最后被读取
我使用下面的代码来解析文件
public class TempMain {
public static void main(String [] args) throws IOException, ParseException {
JsonFactory jfactory = new JsonFactory();
ObjectMapper mapper = new ObjectMapper();
try(JsonParser jParser = jfactory.createParser(new File("/tmp/file.json"))) {
// loop until token equal to "}"
while (jParser.nextToken() != com.fasterxml.jackson.core.JsonToken.END_OBJECT) {
String fieldname = jParser.getCurrentName();
jParser.nextFieldName();
if ("Node1.1".equals(fieldname)) {
/** current token is "[", move next messages is array, loop until token equal to "]"
**/
jParser.nextToken();
while(jParser.nextToken() == com.fasterxml.jackson.core.JsonToken.START_OBJECT) {
// read everything from this START_OBJECT to the matching END_OBJECT
// and return it as a tree model ObjectNode
ObjectNode node = mapper.readTree(jParser);
// Logic to process the data
}
}
}
jParser.close();
} catch(Exception e) {
e.printStackTrace();
}
}
}JSON是一种向前读取格式。除非您不关心任何类型的验证,即您正在读取的数据确实是您期望的数据,而不是一个名称完全不同的完全不同的对象,否则就不可能从最后读取它
安排接收包含您首先需要的数据的JSON文件。对已经重写的文件安装预解析,以便它们按照您需要的顺序使用。这样,在关键时刻,您将能够高效地读取文件。是否对“键”中的节点名称进行了排序?@NeerajJain No its not sorteds因为Node1是Map的键,所以您可以稍微调整逻辑以实现您的愿望<代码>设置键=节点1.keySet();keys.toArray()[keys.size];//这一行将为您提供地图中的最后一个关键点@NeerajJain我已经更新了问题,说明了我如何解析文件,而且由于它是一个大型JSON,我无法将数据加载到内存中。这可能是解决方案,但我正在处理的文件是外部文件,重新安排文件将是一项开销