从文本文件中读取多个 JSON 对象

use*_*887 6 java json jackson gson

我的问题类似于这里提出的问题。几点:

  1. 我无法更改格式。(不加逗号等)
  2. 这基本上是一个巨大的 .txt 文件,其中包含 1000 个 Json 对象。
  3. 我的 Json 对象很大。

这就是我现在正在做的事情:

    FileReader fileReader = new FileReader(fileName);
        BufferedReader reader = new BufferedReader(fileReader);
        String data = "";
        while((data = reader.readLine()) != null){
            ObjectMapper mapper = new ObjectMapper();
            Map<String,String> map = mapper.readValue(data, Map.class);
        }
Run Code Online (Sandbox Code Playgroud)

目前我正在使用 Jackson,理想情况下我想一次从文件中读取一个 Json 对象,解析它,然后继续下一个。我需要从这些 Json 对象中计算出唯一数量的 id 并执行更多操作。最好一一阅读。

杰克逊会是最好的前进方式吗? 是解析巨大 Json 的一个很好的例子,但它只处理每个文件一个对象。我的文件有巨大的 Jsons(其中 1000 个)。

Dus*_*czh 5

这是一个对我有用的杰克逊示例。我在一个 json 文件中有数千个 json 对象(令牌)。此代码将遍历文件读取每个令牌并打印它的序列号。

所需的进口:

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.ObjectMapper;
Run Code Online (Sandbox Code Playgroud)

使用 Jackson 从以下位置读取多个 json 对象FileInputStream

try (FileInputStream fis = new FileInputStream("D:/temp/tokens.json")) {
        JsonFactory jf = new JsonFactory();
        JsonParser jp = jf.createParser(fis);
        jp.setCodec(new ObjectMapper());
        jp.nextToken();
        while (jp.hasCurrentToken()) {
            Token token = jp.readValueAs(Token.class);
            jp.nextToken();
            System.out.println("Token serial "+token.getSerialNumber());
        }
    }
Run Code Online (Sandbox Code Playgroud)


amr*_*shu 5

这是一个更适合您的查询的 JAVA 8ish 解决方案,对于任何需要花费大量时间进行解析的地方,我总是倾向于使用 BufferedReader 而不是 InputStreams。

 ObjectMapper mapper  = new ObjectMapper();
 JsonFactory jsonFactory = new JsonFactory();
 try(BufferedReader br = new BufferedReader(new FileReader("luser.txt"))) {
     Iterator<luser> value = mapper.readValues( jsonFactory.createParser(br), luser.class);
     value.forEachRemaining((u)->{System.out.println(u);});
 }
Run Code Online (Sandbox Code Playgroud)

在每次迭代中,每个对象的反序列化作为 next() 的一部分发生。