使用Java在现有json文件中附加json对象

时间:2019-02-07 13:35:27

标签: java json gson

我试图每次在现有JSON数组中附加JSON对象。为此,我正在使用GSON库。尝试以下代码:

OrderIDDetailBean ord = new OrderIDDetailBean();
ord.uniqueID = "sadasdas0w021";
ord.orderID = "Nand";

ord.cartTotal = "50";
ord.date = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss.SSS").format(new Date());

try {
    JsonWriter writer = new JsonWriter(new FileWriter("D:\\file.json", true));

    writer.beginArray();
    writer.beginObject();

    writer.name("uniqueID").value(ord.uniqueID);
    writer.name("orderID").value(ord.orderID);
    writer.name("cartTotal").value(ord.cartTotal);
    writer.name("date").value(ord.date);
    writer.endObject();
    writer.endArray();

    writer.close();
} catch (IOException e) {
    e.printStackTrace();
}

但是它每次都创建JSON数组而不是附加。

实际:

[  
   {  
      "uniqueID":"CHECKOUT_ES01",
      "orderID":"5001787761",
      "date":"07-02-2019 15:31:41.637",
      "cartTotal":"11.44"
   } 
]

[
   {  
      "uniqueID":"CHECKOUT_ES01",
      "orderID":"5001787767",
      "date":"07-02-2019 15:35:20.347",
      "cartTotal":"11.44"
   }
]

预期:

[  
   {  
      "uniqueID":"CHECKOUT_ES01",
      "orderID":"5001787761",
      "date":"07-02-2019 15:31:41.637",
      "cartTotal":"11.44"
   },
   {  
      "uniqueID":"CHECKOUT_ES01",
      "orderID":"5001787767",
      "date":"07-02-2019 15:35:20.347",
      "cartTotal":"11.44"
   }
]

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

使用这种方法,您可能会拥有一个文件,其中包含许多数组,每个数组都有一个对象。我建议使用Gson.fromJson(..)Gson.toJson(..)而不是JsonWriter

假设您要添加的对象如下:

@AllArgsConstructor
@Getter @Setter
public class OrderIDDetailBean {
    private String uniqueID;
    private Integer orderID;
    private Date date;
    private Double cartTotal;        
}

然后添加新对象将如下:

@Test
public void test() throws Exception {
    Gson gson = new GsonBuilder().setPrettyPrinting().create();
    // construct Type that tells Gson about the generic type
    Type dtoListType = new TypeToken<List<OrderIDDetailBean>>(){}.getType();
    FileReader fr = new FileReader("test.json");
    List<OrderIDDetailBean> dtos = gson.fromJson(fr, dtoListType);
    fr.close();
    // If it was an empty one create initial list
    if(null==dtos) {
        dtos = new ArrayList<>();
    }
    // Add new item to the list
    dtos.add(new OrderIDDetailBean("23", 34234, new Date(), 544.677));
    // No append replace the whole file
    FileWriter fw  = new FileWriter("test.json");
    gson.toJson(dtos, fw);
    fw.close();        
}