【问题标题】:Read Multiple JSON object from a Text File从文本文件中读取多个 JSON 对象
【发布时间】:2015-08-07 06:00:56
【问题描述】:

我的问题类似于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 的一个很好的例子,但它每个文件只处理一个对象。我的文件有巨大的 Json(其中 1000 个)。

【问题讨论】:

  • 问:您是否尝试过使用 Jackson Streaming API 解析 JSON(根据您的链接)?你确定它不能在一个文件中处理多个 JSON 对象吗?
  • 我已经尝试过在This link 中做同样的事情。它只解析第一个 json 对象并停止。
  • 解析器是否将InputStreamReader 作为参数?在这种情况下,可能会循环读取对象,直到 InputStream 达到 EOF(检查 available)。
  • 这可能行得通。它确实有一个阅读器。它现在正在遍历不同的对象,但它搞砸了其中的嵌套对象。我会尝试修复它,看看它是否有效。谢谢。
  • 如果你想用Jackson 为什么要标记这个问题Gson?

标签: java json jackson gson


【解决方案1】:

这是一个适合我的 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());
        }
    }

【讨论】:

    【解决方案2】:

    对于您的查询,这是一个更加 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() 的一部分发生。

    【讨论】:

      【解决方案3】:

      这是我如何使用 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;
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-25
        相关资源
        最近更新 更多