Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Converter json em XML

Galera, preciso de ajuda, tenho que fazer uma consulta no banco em um campo que armazena XML e o front-end me envia json. É uma consulta de log, então a front vai sempre me mandar no json o primeiro campo como o nome da tabela e o outro será uma lista de parâmetros, o que preciso é pegar o segundo parâmetro(lista) em json e converter para xml. Tenho que usar o Jackson. Alguém pode me ajudar?

json de entrada: { "nmtabela":"CLIENTES", "params": [ { "ID": "45096" }, { "PENDENCIA":"S" } ] }

XML de saída(o que eu preciso, mas não estou conseguindo) 45096S

Classe Endpoint e método extracao que recebe a request

public Response extracao(@PathParam("mapping") String mapping, Map<String, Object> values) {

    // verifica se existe uma entrada para o mapping solicitado
    try (InputStream is = LogsEndpoint.class.getResourceAsStream("/rs/logs/queries/receber/" + mapping + ".json")) {
        if (is != null) {
            StringBuilder valorXML = new StringBuilder();
            Map<String, Object> map = new HashMap<>();

//* aqui é o ponto em que preciso converter o value em xml fiz algumas tentativas mas não tive sucesso*//

            for (Map.Entry<String, Object> v : values.entrySet()) {
                if (v.getKey().equals("nmtabela")) {
                    map.put(v.getKey(), v.getValue());
                } else if (v.getKey().equals("params")) {

                    ObjectMapper objectMapper = new ObjectMapper();
                    byte[] test;
                    test = objectMapper.writeValueAsBytes(v.getValue());
                    System.out.println(objectMapper.toString());
                }
            }

            return Response.ok((new QueryProcessorLogs()).execute(is, values)).build();
        } else {
            return Response.status(Response.Status.BAD_REQUEST).entity(new FailedResponse("Modelo de extração inválido")).build();
        }
    } catch (RuntimeException e) {
        LelloServicesLogger.severe(e);
        return Response.status(Response.Status.BAD_REQUEST).entity(new FailedResponse(e.getMessage())).build();
    } catch (Exception e) {
        LelloServicesLogger.severe(e);
        return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(new FailedResponse("Houve um problema na extração do conteúdo")).build();
    }
}
5 respostas

mais uma tentativa sem sucesso

for (Map.Entry<String, Object> v : values.entrySet()) { if (v.getKey().equals("nmtabela")) { map.put(v.getKey(), v.getValue()); } else if (v.getKey().equals("params")) { String valueXml = XML.toString(v.getValue()); System.out.println(valueXml.toString()); } }

Oi Roberto,

vc precisa fazer isso na "raça" ou pode usar alguma biblioteca?

Pergunto pois pelo que eu vi a lib Json-Java faz isso bem facil:

JSONObject jsonObj = new JSONObject(jsonString);
String xml = XML.toString(jsonObj);

http://stleary.github.io/JSON-java/index.html

abs, Nico

Nico, muito obrigado pela resposta, esse é meu primeiro tópico, e você quem respondeu, eu já assisti um monte de cursos com você. Cara não preciso fazer na mão, mas tem que ser alguma biblioteca que faça parte do Core, e você foi direto no ponto. Mas ainda preciso de ajuda, se você reparar no meu @PathParam eu recebo um map, e na hora de te fazer a conversão como você mencionou os itens não são encontrados. Eu fiz conforme abaixo. if (is != null) { StringBuilder valorXML = new StringBuilder(); Map<String, Object> map = new HashMap<>();

            for (Map.Entry<String, Object> v : values.entrySet()) {
                if (v.getKey().equals("nmtabela")) {
                    map.put(v.getKey(), v.getValue());
                } else if (v.getKey().equals("params")) {


                    JSONObject jsonObj = new JSONObject(v.getValue());
                    String xml = XML.toString(jsonObj);
                    System.out.println(xml);
                }
            }

Mas o conteúdo da String xml fica: false

O v.getValue é um ArrayList, que contém [{id=45096}, {PENDENCIA=S}] Será que tenho tenho que passar cada item do array para a biblioteca ou ela aceita um ArrayList?

Galera, resolvi mudando o parâmetro que recebo a requisição, antes eu recebia um map, agora, criei uma entidade que já mapeia o meu json e ficou mais fácil do que como estava antes(eu recebia um map e um dos itens desse map era um list e esse list eu precisava converter em xml). Não sei se ficou claro o meu problema, eu recebibo um json e um dos campos desse json é uma lista, essa lista eu preciso converter em xml e com esse xml buscar alguma correspondência na base. Embora resolvido, fiquei com duas dúvidas.

1) a bliblioteca jackson, faz o que eu precisava, converte um json/map com list em xml?

2) abaixo segue a meu código, acho que não ficou muito elegante, alguma sugestão para melhorar esse código?

@POST
    @Path("/{mapping}")
    public Response extracao(@PathParam("mapping") String mapping, LogQuery values) {

        try (InputStream is = LogsEndpoint.class.getResourceAsStream("/rs/logs/queries/receber/" + mapping + ".json")) {
            if (is != null) {
                Map<String, Object> value = new LinkedHashMap<>();
                value.put("nmtabela", values.getNmtabela());
                String tag = "";
                for (LogParams v : values.getParams()) {
                    tag = tag + "'%" + "<" + v.getKey()+ ">" + v.getValue() + "</" + v.getKey() + ">%' AND DADOSATUAIS LIKE ";
                }
                tag = tag.substring(0, (tag.length() - 22));
                value.put("params", tag.toUpperCase());

                return Response.ok((new QueryProcessorLogs()).execute(is, value)).build();
            } else {
                return Response.status(Response.Status.BAD_REQUEST).entity(new FailedResponse("Modelo de extração inválido")).build();
            }
        } catch (RuntimeException e) {
            LelloServicesLogger.severe(e);
            return Response.status(Response.Status.BAD_REQUEST).entity(new FailedResponse(e.getMessage())).build();
        } catch (Exception e) {
            LelloServicesLogger.severe(e);
            return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(new FailedResponse("Houve um problema na extração do conteúdo")).build();
        }
    }


public class LogQuery {

    @Getter @Setter 
    String nmtabela;

    @Getter @Setter 
    List<LogParams> params;
}


public class LogParams {

    @Getter @Setter 
    private String key;

    @Getter @Setter 
    private String value;
}
solução!

Oi Roberto,

1) a bliblioteca jackson, faz o que eu precisava, converte um json/map com list em xml?

O Jackson tbm faz isso. Existe uma classe XmlMapper que sabe gera o XML e o ObjectMapper sabe ler o JSON. AQUI tem um exemplo.

2) abaixo segue a meu código, acho que não ficou muito elegante, alguma sugestão para melhorar esse código?

Sobre o seu codigo: eu tiraria/separaria tudo que está dentro de if e colocaria numa classe separada. Tudo bem?

abs