ndJson(换行分隔的JSON)把多个JSON对象按行存放,每一行都是一个独立且完整的JSON。使用Gson解析这种格式时,最好的方式是借助JsonReader按流读取,而不是把整个文件读成字符串再拆分。这样可以处理非常大的数据文件而不会因为内存占用过高导致程序崩溃。

引入Gson依赖
在Java项目中使用Gson,首先需要在构建工具里添加依赖。以Maven为例,添加如下内容:
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.10.1</version> </dependency>
定义数据实体类
假设ndJson里每一行都是一个用户记录,我们可以定义对应的Java类:
public class User {
private String name;
private int age;
// Getter和Setter
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
}
使用JsonReader解析多条记录
Gson提供了JsonReader,可以基于Reader逐条解析。下面示例从文件读取ndJson并转为User对象列表:
import com.google.gson.Gson;
import com.google.gson.stream.JsonReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
public class NdJsonParser {
public static List<User> parse(String filePath) throws Exception {
Gson gson = new Gson();
List<User> users = new ArrayList<>();
// 创建JsonReader,逐行读取ndJson
try (JsonReader reader = new JsonReader(new FileReader(filePath))) {
reader.beginArray(); // 如果ndJson被包在数组里可去掉此行
while (reader.hasNext()) {
User u = gson.fromJson(reader, User.class);
users.add(u);
}
reader.endArray();
}
return users;
}
}
如果ndJson是纯换行分隔、没有外层数组,则不需要调用beginArray和endArray,直接循环读取即可:
import com.google.gson.Gson;
import com.google.gson.stream.JsonReader;
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
public class NdJsonLineParser {
public static List<User> parseLines(String filePath) throws Exception {
Gson gson = new Gson();
List<User> users = new ArrayList<>();
try (BufferedReader br = new BufferedReader(new FileReader(filePath));
JsonReader reader = new JsonReader(br)) {
while (reader.peek() != null) {
User u = gson.fromJson(reader, User.class);
if (u != null) users.add(u);
}
}
return users;
}
}
注意事项与异常处理
- 确保每行都是合法JSON,否则fromJson会抛出JsonSyntaxException。
- 处理大文件时不要用readLine再解析字符串,直接用JsonReader流方式更省内存。
- 若数据来自网络流,可将InputStream传给InputStreamReader再包装为JsonReader。
使用Gson解析ndJson的核心思路是:把输入当作JSON流,而不是当作单个大JSON文档。
小结
通过JsonReader配合Gson的fromJson方法,可以稳定高效地解析ndJson中的多条记录。这种方式既适合小文件,也能支撑大规模数据场景,是Java后端处理流式JSON的实用方案。