使用 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 );

}