我有一个大约65 MB以下格式的大型JSON文件
{
"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来解析我想要读取节点Node1.3的大文件 然后读取Node1.1并创建一个POJO对象,它将包含Node1.1 Array中的所有数据,并且每个数据都与fromDate和toDate相关联。如果按顺序进行,我可以解析文件,但最后会读取Node1.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();
}
}
}
答案 0 :(得分:1)
JSON是一种前瞻性格式。除非您不关心任何类型的验证,即您正在阅读的数据实际上是您期望的数据,而不是完全不同的完全不同的对象,否则无法从最终读取它。 / p>
安排接收使用您首先需要的数据组织的JSON文件。安装对已有文件的预解析,以便重写它们,以便它们使用您需要的顺序。这样,在它重要的那一刻,你就能够有效地阅读文件。