Gerando json com JsonGenerator em Java

Marcos
3 min readFeb 27, 2021

--

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

--

--

Marcos
Marcos

Written by Marcos

I study software development and I love memes.

No responses yet