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

时间:2015-08-07 06:00:56

标签: java json jackson gson

我的问题类似于here所提出的问题。 几点:

  1. 我无法更改格式。 (没有逗号添加等)
  2. 这基本上是一个包含1000个Json对象的巨大的.txt文件。
  3. 我的Json对象很大。
  4. 这就是我现在正在做的事情:

        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(1000个)。

3 个答案:

答案 0 :(得分:2)

以下是我使用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;
    }

答案 1 :(得分:1)

这是杰克逊的一个例子,对我有用。我在一个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 :(得分:1)

这是针对您的查询的更多JAVA 8ish解决方案,我总是倾向于使用InputStreams上的BufferedReader,以便在任何需要大量时间进行解析的地方。

 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()的一部分发生。