从文本文件中读取多个 JSON 对象
Read Multiple JSON object from a Text File
我的问题与 here 的问题相似。
几点:
- 我无法更改格式。 (没有添加逗号等)
- 这基本上是一个包含 1000 个 Json 对象的巨大 .txt 文件。
- 我的 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() 的一部分发生。
我的问题与 here 的问题相似。 几点:
- 我无法更改格式。 (没有添加逗号等)
- 这基本上是一个包含 1000 个 Json 对象的巨大 .txt 文件。
- 我的 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() 的一部分发生。