Manipulação de Dados JSON em Java: Importação e Exportação

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>

Tags: java JSON FastJSON maven Exportação de Dados

Publicado em 6-11 19:36 por Thomas