首页 > 解决方案 > 为集合中的每个元素调用 JsonGenerator 方法

问题描述

我有一种方法可以使用 JsonGenerator 将产品对象写入文件。(productToJSON)

我想使用第二种方法使用 JsonGenerator 流将 HashSet 中的所有产品写入 JSON 文件。我认为打开和关闭流存在问题(文件仅包含最后一个产品)。所以我可以在第二种方法中打开和关闭流,但第一种方法不再适用于 1 个产品。

请告诉我:

  1. 是否可以使用 2 种方法来做我想做的事?
  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);
    }
}

标签: java

解决方案


方法一 - 始终调用 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();
}

推荐阅读