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

Read Multiple JSON object from a Text File

我的问题与 here 的问题相似。 几点:

  1. 我无法更改格式。 (没有添加逗号等)
  2. 这基本上是一个包含 1000 个 Json 对象的巨大 .txt 文件。
  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);
        }

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

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

下面是我如何使用 Gson 的 JSONReader API 来处理与上面类似的需求

public static List<YOURPOJO> readTraceLog(String filepath) throws IOException {

         Gson gson = new Gson();
         JsonReader jsonReader = new JsonReader(new FileReader(filepath));
         // important as handles unwanted formatting stuffs such empty spaces 
        jsonReader.setLenient(true);

        boolean start = true; // start of read
        jsonReader.beginObject(); // first object begins
        //List to hold object 
        List<YOURPOJO> completeList = new ArrayList<YOURPOJO>();
        //YOURPOJO has two attributes one is ID and other is list of ANOTHERPOJO

        while (jsonReader.hasNext()) {
            if (!start) {
                //to stop end of Document
                if (jsonReader.peek().toString().matches("END_DOCUMENT")) {
                    break;
                }
                //continue reading object as the come -{
                jsonReader.beginObject();

            }
            start = false;
            YOURPOJO pojo = new YOURPOJO();
            //read attribute id
            String name = jsonReader.nextName();
            pojo.setId(name);

            //list to store ANOTHERPOJO objects
            List<ANOTHERPOJO> tempList = new ArrayList<ANOTHERPOJO>();

            //begin reading list - [
            jsonReader.beginArray();
            while (jsonReader.hasNext()) {
                ANOTHERPOJO t = gson.fromJson(jsonReader, ANOTHERPOJO.class);
                tempList.add(t);
            }
            //end reading list - ]
            jsonReader.endArray();

            //store data
            pojo.setTraceDetails(tempList);
            completeList.add(YOURPOJO);

            //end of object  - }
            jsonReader.endObject();

        }

        jsonReader.close();
        return completeList;
    }

这是一个适合我的 Jackson 示例。我在单个 json 文件中有数千个 json 对象(令牌)。此代码将遍历文件读取每个标记并打印它的序列号。

需要导入:

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.ObjectMapper;

使用 Jackson 从 FileInputStream 中读取多个 json 对象:

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());
        }
    }

这里有一个更 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);});
 }

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