Uma forma bem útil de escrever arquivos json em java é utilizar a classe JsonGenerator. Essa é uma classe que define uma API para escrever algo em formato json. Para criar uma instância deve-se usar os métodos de fábrica de uma instância da classe JsonFactory. Exemplo de criação de uma instância:
import br.com.mmarcosab.api.usecase.ArquivoUseCase;
import com.fasterxml.jackson.core.JsonEncoding;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
@Slf4j
@Component
public class ArquivoUseCaseImpl implements ArquivoUseCase {
public void escreverArquivo(){
final File ARQUIVO = new File("./arquivo.json");
try {
final OutputStream outputStream = new FileOutputStream(ARQUIVO);
final JsonFactory jsonFactory = new JsonFactory();
final JsonGenerator jsonGenerator = jsonFactory.createGenerator(outputStream, JsonEncoding.UTF8);
jsonGenerator.setCodec(new ObjectMapper());
jsonGenerator.writeStartObject();
jsonGenerator.writeEndObject();
jsonGenerator.close();
outputStream.close();
} catch (Exception e){
log.error("Houve um erro ao escrever o arquivo: {}", e.getMessage());
}
}
}
No caso acima estou criando um arquivo físico com o json que escrevi, dá pra perceber isso pela seguinte linha:
final File ARQUIVO = new File("./arquivo.json");
Esse código apenas cria um arquivo, não faz nada mais. Para ficar mais fácil de testar esse código criei a controller abaixo nesse em um projetinho. Se liga:
import br.com.mmarcosab.api.usecase.ArquivoUseCase;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/arquivo")
@RequiredArgsConstructor
public class ArquivoController {
private final ArquivoUseCase arquivoUseCase;
@GetMapping
public void gerarArquivo(){
arquivoUseCase.escreverArquivo();
}
}
Quando rodar a api é só chamar a rota: http://localhost:9000/arquivo e o arquivo será gerado na raiz do projeto:
Agora vamos colocar conteúdo nesse arquivo, se liga nesses métodos:
- Para escrever números: writeNumberField(//parâmetros);
- Para escrever strings: writeStringField(//parâmetros);
- Para escrever listas: writeStartArray(//parâmetros);
E há uma série de métodos:
Nesse exemplo estou usando os seguintes métodos:
public void escreverArquivo() {
final File ARQUIVO = new File("./arquivo.json");
try {
final OutputStream outputStream = new FileOutputStream(ARQUIVO);
final JsonFactory jsonFactory = new JsonFactory();
final JsonGenerator jsonGenerator = jsonFactory.createGenerator(outputStream, JsonEncoding.UTF8);
jsonGenerator.setCodec(new ObjectMapper());
jsonGenerator.writeStartObject();
jsonGenerator.writeStringField("teste", "Valor de teste");
jsonGenerator.writeNumberField("numero", 1234);
jsonGenerator.writeFieldName("campo 1");
jsonGenerator.writeStartObject();
jsonGenerator.writeStringField("campo 2", "valor do campo 2");
jsonGenerator.writeEndObject();
jsonGenerator.writeFieldName("campo 1");
jsonGenerator.writeStartArray();
jsonGenerator.writeStartObject();
jsonGenerator.writeStringField("campo 2", "valor do campo 2");
jsonGenerator.writeEndObject();
jsonGenerator.writeEndArray();
jsonGenerator.writeEndObject();
jsonGenerator.close();
outputStream.close();
} catch (Exception e) {
log.error("Houve um erro ao escrever o arquivo: {}", e.getMessage());
}
E no fim gerei o seguinte arquivo:
Tem número, texto, objeto e até uma lista..
Além disso, qualquer erro será gravado no log:
Esse exemplo está no meu github: https://github.com/mmarcosab/example-jsongenerator