Este artigo demonstra como realizar a importação de dados através de arquivos no formato JSON e a exportação de dados para arquivos JSON utilizando Java.
Dependências Maven
A seguir, as dependênccias necessárias para o projeto:
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.70</version>
</dependency>
Classe Utilitária JsonHandler
package com.example.utils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import org.apache.commons.io.FileUtils;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
/**
* Utilitário para exportação e importação de JSON.
*/
public class JsonHandler {
/**
* Lê um arquivo JSON e retorna seu conteúdo.
* @param arquivoUpload Arquivo enviado pelo cliente
* @return Mapa com resultado da operação
*/
public static Map<string string=""> lerArquivoJson(MultipartFile arquivoUpload) {
Map<string string=""> resposta = new HashMap<>();
try {
String nomeArquivo = arquivoUpload.getOriginalFilename();
String extensao = nomeArquivo.substring(nomeArquivo.lastIndexOf("."));
// Converte MultipartFile para arquivo temporário
File arquivoTemporario = new File("/" + nomeArquivo);
FileUtils.copyInputStreamToFile(arquivoUpload.getInputStream(), arquivoTemporario);
String conteudoJson = FileUtils.readFileToString(arquivoTemporario, "UTF-8");
if (".json".equals(extensao) || ".txt".equals(extensao)) {
resposta.put("resultado", conteudoJson);
resposta.put("codigo", "200");
resposta.put("mensagem", "Upload realizado com sucesso!");
} else {
resposta.put("resultado", "");
resposta.put("codigo", "500");
resposta.put("mensagem", "Por favor, envie um arquivo .json ou .txt válido!");
}
} catch (Exception e) {
e.printStackTrace();
resposta.put("resultado", "");
resposta.put("codigo", "500");
resposta.put("mensagem", e.getMessage());
}
return resposta;
}
/**
* Exporta um objeto para arquivo JSON.
* @param resposta Objeto HttpServletResponse
* @param objeto Objeto a ser exportado
* @param nomeArquivo Nome do arquivo de saída
*/
public static void exportarParaJson(HttpServletResponse resposta, Object objeto, String nomeArquivo){
try {
String conteudoJson = JSON.toJSONString(objeto,
SerializerFeature.PrettyFormat,
SerializerFeature.WriteMapNullValue,
SerializerFeature.WriteDateUseDateFormat);
String caminhoCompleto = "/" + nomeArquivo;
File arquivoSaida = new File(caminhoCompleto);
Writer escritor = new OutputStreamWriter(new FileOutputStream(arquivoSaida), StandardCharsets.UTF_8);
escritor.write(conteudoJson);
escritor.flush();
escritor.close();
FileInputStream fis = new FileInputStream(arquivoSaida);
// Força download
resposta.setContentType("application/force-download");
resposta.setHeader("Content-Disposition", "attachment;filename="
.concat(String.valueOf(URLEncoder.encode(nomeArquivo, "UTF-8"))));
resposta.setCharacterEncoding("utf-8");
OutputStream os = resposta.getOutputStream();
byte[] buffer = new byte[1024];
int tamanho;
while((tamanho = fis.read(buffer)) != -1) {
os.write(buffer, 0, tamanho);
}
fis.close();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
</string></string>
Exemplo de Controller
@RestController
@RequestMapping("/api/dados")
public class DadosController {
@Autowired
private UsuarioService usuarioService;
/**
* Exporta dados de usuário para arquivo JSON
* @param resposta Resposta HTTP
* @param id ID do usuário
* @param nome Nome do arquivo
*/
@GetMapping(value = "/exportar")
public void exportarDadosJson(HttpServletResponse resposta,
@RequestParam(name="id",required=false)String id,
@RequestParam(name="nome",required=false)String nome) {
final Usuario usuario = usuarioService.buscarPorId(id); // Implementação específica do negócio
if (null == usuario) {
throw new RecursoNaoEncontradoException("Usuário não encontrado!");
}
// Exporta dados
JsonHandler.exportarParaJson(resposta, usuario, nome + "-" + GeradorUUID.gerarUUID8() + ".json");
}
/**
* Importa dados de usuário a partir de arquivo JSON
* @param arquivoUpload Arquivo enviado
* @return Resultado da operação
*/
@PostMapping(value = "/importar")
public Object importarDadosJson(MultipartFile arquivoUpload) {
final Map<string string=""> resultado = JsonHandler.lerArquivoJson(arquivoUpload);
if ("200".equals(resultado.get("codigo"))) {
String conteudoJson = resultado.get("resultado");
final Usuario usuario = JSON.parseObject(conteudoJson, Usuario.class);
// Importa dados
usuarioService.salvar(usuario);
}
return resultado;
}
}
</string>