java - 为集合中的每个元素调用 JsonGenerator 方法
问题描述
我有一种方法可以使用 JsonGenerator 将产品对象写入文件。(productToJSON)
我想使用第二种方法使用 JsonGenerator 流将 HashSet 中的所有产品写入 JSON 文件。我认为打开和关闭流存在问题(文件仅包含最后一个产品)。所以我可以在第二种方法中打开和关闭流,但第一种方法不再适用于 1 个产品。
请告诉我:
- 是否可以使用 2 种方法来做我想做的事?
- 有更好的方法吗?
public void productToJSON(Product product, String fileName) throws Exception {
JsonFactory jsonFactory = new JsonFactory();
FileOutputStream file = new FileOutputStream(fileName);
JsonGenerator jsonGen = jsonFactory.createJsonGenerator(file, JsonEncoding.UTF8);
jsonGen.setPrettyPrinter(new DefaultPrettyPrinter());
jsonGen.writeStartObject();
jsonGen.writeStringField("name", product.getName());
jsonGen.writeNumberField("weight", product.getWeight());
jsonGen.writeNumberField("stock", product.getStock());
jsonGen.writeNumberField("price", product.getPrice());
jsonGen.writeNumberField("rating", product.getRating());
jsonGen.writeEndObject();
jsonGen.close();
}
public void productsToJSON(String fileName) throws Exception {
for (Product p : this.products) {
this.productToJSON(p, fileName);
}
}
解决方案
方法一 - 始终调用 productsToJSON:
private void productToJSON(Product product, JsonGenerator jsonGen) throws Exception {
jsonGen.writeStartObject();
jsonGen.writeStringField("name", product.getName());
jsonGen.writeNumberField("weight", product.getWeight());
jsonGen.writeNumberField("stock", product.getStock());
jsonGen.writeNumberField("price", product.getPrice());
jsonGen.writeNumberField("rating", product.getRating());
jsonGen.writeEndObject();
}
public void productsToJSON(String fileName) throws Exception {
JsonFactory jsonFactory = new JsonFactory();
FileOutputStream file = new FileOutputStream(fileName);
JsonGenerator jsonGen = jsonFactory.createJsonGenerator(file, JsonEncoding.UTF8);
jsonGen.setPrettyPrinter(new DefaultPrettyPrinter());
if (this.products.size > 1) {
jsonGen.writeStartArray(this.products.size)
}
for (Product p: this.products) {
this.productToJSON(p, jsonGen);
}
if (this.products.size > 1) {
jsonGen.writeEndArray()
}
jsonGen.close();
}
方法二 - 一种私有方法和两种公共方法:
private void productToJSON(Product product, JsonGenerator jsonGen) throws Exception {
jsonGen.writeStartObject();
jsonGen.writeStringField("name", product.getName());
jsonGen.writeNumberField("weight", product.getWeight());
jsonGen.writeNumberField("stock", product.getStock());
jsonGen.writeNumberField("price", product.getPrice());
jsonGen.writeNumberField("rating", product.getRating());
jsonGen.writeEndObject();
}
public void productsToJSON(String fileName) throws Exception {
JsonFactory jsonFactory = new JsonFactory();
FileOutputStream file = new FileOutputStream(fileName);
JsonGenerator jsonGen = jsonFactory.createJsonGenerator(file, JsonEncoding.UTF8);
jsonGen.setPrettyPrinter(new DefaultPrettyPrinter());
jsonGen.writeStartArray(this.products.size)
for (Product p: this.products) {
this.productToJSON(p, jsonGen);
}
jsonGen.writeEndArray()
jsonGen.close();
}
public void productToJSON(Product p, String fileName) throws Exception {
JsonFactory jsonFactory = new JsonFactory();
FileOutputStream file = new FileOutputStream(fileName);
JsonGenerator jsonGen = jsonFactory.createJsonGenerator(file, JsonEncoding.UTF8);
jsonGen.setPrettyPrinter(new DefaultPrettyPrinter());
this.productToJSON(p, jsonGen);
jsonGen.close();
}
推荐阅读
- coldfusion - Cold Fusion 2018:如何将 .xlsx 文件另存为 .csv
- javascript - 如何使用 Vuejs 在 Safari 中侦听表单上的粘贴事件
- r - 如何在 plotly R 图表上添加完全相同的右轴?
- restheart - restheart 插件骨架中的身份验证失败
- c++ - lvalue 和 rvalue getter,是否可以删除它们?
- java - Micronaut 数据的问题
- ios - 将按钮添加到堆栈视图完全占用父堆栈视图
- python - 以编程方式获取最新的 python 3 版本
- laravel - Laravel Eloquent 在 whereHas() 上进行选择
- android - 如何替换对话框文本按钮的颜色?