使用 gson 写入 java 中的 json 文件
Writing to a json file in java using gson
我正在创建一个 java 程序,该程序使用 Gson 库将数据读取和写入 json 文件。因为当我将新数据写入 json 文件时,它被写入文件的末尾,而不是 json.
中的对象内部
这是我的json内容:
{
"employees":[
{
"name":"xxxxxxx",
"position":"yyyyyy"}
]
}
这是我的代码:
private static void writetojson(Hisab hi) {
try {
FileOutputStream os=new FileOutputStream(file,true);
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(os));
Gson gson=new GsonBuilder().setPrettyPrinting().create();
String temp=gson.toJson(hi);
bw.append(temp);
bw.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
和 DTO class
public class Hisab {
String empname;
String position;
public String getempname() {
return empname;
}
public void setempname(String empname) {
this.empname = empname;
}
public String getposition() {
return position;
}
public void setposition(String opsition) {
this.position = position;
}
}
这是我 运行 程序时的输出:
{
"employees":[
{
"name":"xxxxxxx",
"position":"yyyyyy"}
]
}
{
"name":"zzzzzz",
"position":"aaaaaaa"}
但这是我想要的输出:
{
"employees":[
{
"name":"xxxxxxx",
"position":"yyyyyy"},
{
"name":"zzzzzz",
"position":"aaaaaaa"}
]
}
如何解决这个问题。请帮助我。
创建你的基地类
public class Employee
{
private String name;
private String position;
// getter setter
}
public class RootObject
{
private ArrayList<Employee> employees;
// getter setter
}
Gson gson = new Gson();
RootObject rootObj = new RootObject();
rootObj.setEmployees(yourList);
// convert java object to JSON format,
// and returned as JSON formatted string
String json = gson.toJson(rootObj);
您的方法有几个问题,第一个是如果由于某种原因附加失败,您可能会丢失原始内容和新内容。
另外,你的存储格式比较奇怪;为什么单对象键?不需要;直接报废,直接存入数组
现在,我不做 Gson,而是做 Jackson,所以我无法帮助您处理实际代码,但基本上您的代码应该如下所示:
final Charset cs = StandardCharsets.UTF_8;
final Path toReplace = Paths.get("whereverisyourfile");
final Path newContents = toReplace.resolveSibling("newcontents.json");
try (
final BufferedReader reader = Files.newBufferedReader(toReplace, cs);
final BufferedWriter writer = Files.newBufferedWriter(newContents, cs,
StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
) {
// read old content, manipulate, write new contents
}
// IOException is THROWN, not logged
Files.move(newContents, toReplace, StandardCopyOption.REPLACE_EXISTING,
StandardCopyOption.ATOMIC_MOVE);
现在,关于旧内容的阅读和写作,你有两个选择:
- 将整个内容作为 POJO 读取,您在编写之前对其进行修改;
- 使用您图书馆的流式传输 API。
以上是您的选择,取决于存储数据的大小等。
如果有IOException,这个方法应该THROW,这样你就可以处理异常情况。只是 printStackTrace()
例外从来都不是好的选择。
你的 DTO 需要是,
class JsonCollection {
ArrayList<Hisab> employees;
public JsonCollectio() {
this.employees = new ArrayList<Hisab>();
}
public void setEmployees( ArrayList<Hisab> emps ) {
this.employees = emps;
}
public ArrayList<Hisab> getEmployees() {
return this.employees;
}
public void addHisab( Hisab h ) {
this.employees.add( h );
}
}
现在,您的 writeToJson 方法应该是这样的,
public void writeToJson( Hisab h ) {
// I am assuming this string has the current Json. Get this from file.
String currentJsonString = "Some Json, you got from file";
Gson gson=new GsonBuilder().setPrettyPrinting().create();
JsonCollection jsonColl = gson.fromJson( currentJsonString, JsonCollection.class );
// Add your hisab to the collection.
jsonColl.addHisab( h );
// Now write this string to file
String newJsonString =gson.toJson( jsonColl );
System.out.print( newJsonString );
}
我正在创建一个 java 程序,该程序使用 Gson 库将数据读取和写入 json 文件。因为当我将新数据写入 json 文件时,它被写入文件的末尾,而不是 json.
中的对象内部这是我的json内容:
{
"employees":[
{
"name":"xxxxxxx",
"position":"yyyyyy"}
]
}
这是我的代码:
private static void writetojson(Hisab hi) {
try {
FileOutputStream os=new FileOutputStream(file,true);
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(os));
Gson gson=new GsonBuilder().setPrettyPrinting().create();
String temp=gson.toJson(hi);
bw.append(temp);
bw.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
和 DTO class
public class Hisab {
String empname;
String position;
public String getempname() {
return empname;
}
public void setempname(String empname) {
this.empname = empname;
}
public String getposition() {
return position;
}
public void setposition(String opsition) {
this.position = position;
}
}
这是我 运行 程序时的输出:
{
"employees":[
{
"name":"xxxxxxx",
"position":"yyyyyy"}
]
}
{
"name":"zzzzzz",
"position":"aaaaaaa"}
但这是我想要的输出:
{
"employees":[
{
"name":"xxxxxxx",
"position":"yyyyyy"},
{
"name":"zzzzzz",
"position":"aaaaaaa"}
]
}
如何解决这个问题。请帮助我。
创建你的基地类
public class Employee
{
private String name;
private String position;
// getter setter
}
public class RootObject
{
private ArrayList<Employee> employees;
// getter setter
}
Gson gson = new Gson();
RootObject rootObj = new RootObject();
rootObj.setEmployees(yourList);
// convert java object to JSON format,
// and returned as JSON formatted string
String json = gson.toJson(rootObj);
您的方法有几个问题,第一个是如果由于某种原因附加失败,您可能会丢失原始内容和新内容。
另外,你的存储格式比较奇怪;为什么单对象键?不需要;直接报废,直接存入数组
现在,我不做 Gson,而是做 Jackson,所以我无法帮助您处理实际代码,但基本上您的代码应该如下所示:
final Charset cs = StandardCharsets.UTF_8;
final Path toReplace = Paths.get("whereverisyourfile");
final Path newContents = toReplace.resolveSibling("newcontents.json");
try (
final BufferedReader reader = Files.newBufferedReader(toReplace, cs);
final BufferedWriter writer = Files.newBufferedWriter(newContents, cs,
StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
) {
// read old content, manipulate, write new contents
}
// IOException is THROWN, not logged
Files.move(newContents, toReplace, StandardCopyOption.REPLACE_EXISTING,
StandardCopyOption.ATOMIC_MOVE);
现在,关于旧内容的阅读和写作,你有两个选择:
- 将整个内容作为 POJO 读取,您在编写之前对其进行修改;
- 使用您图书馆的流式传输 API。
以上是您的选择,取决于存储数据的大小等。
如果有IOException,这个方法应该THROW,这样你就可以处理异常情况。只是 printStackTrace()
例外从来都不是好的选择。
你的 DTO 需要是,
class JsonCollection {
ArrayList<Hisab> employees;
public JsonCollectio() {
this.employees = new ArrayList<Hisab>();
}
public void setEmployees( ArrayList<Hisab> emps ) {
this.employees = emps;
}
public ArrayList<Hisab> getEmployees() {
return this.employees;
}
public void addHisab( Hisab h ) {
this.employees.add( h );
}
}
现在,您的 writeToJson 方法应该是这样的,
public void writeToJson( Hisab h ) {
// I am assuming this string has the current Json. Get this from file.
String currentJsonString = "Some Json, you got from file";
Gson gson=new GsonBuilder().setPrettyPrinting().create();
JsonCollection jsonColl = gson.fromJson( currentJsonString, JsonCollection.class );
// Add your hisab to the collection.
jsonColl.addHisab( h );
// Now write this string to file
String newJsonString =gson.toJson( jsonColl );
System.out.print( newJsonString );
}