【问题标题】:Java - Convert JSON to XML with values on root tagJava - 使用根标签上的值将 JSON 转换为 XML
【发布时间】:2017-11-01 10:36:41
【问题描述】:

我需要用根标签中的值将 JSON 转换为 XML 格式

我已经和 Orden 类配置了 @JsonRootName("orden") 并将 @JsonProperty 添加到所有属性。

实际上,我有一个将 JSON 转换为 XML 但“子节点中的值”的实现。

这是我的转换器实现:

public static String convertJsonObjectToXml (Object obj) throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true);
        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        String jsonString = mapper.writeValueAsString(obj);
        JSONObject json = new JSONObject(jsonString);
        String xml = XML.toString(json);
        return xml;
    }

实现的结果是这样的:

<orden>
                <formaOp>C</formaOp>
                <agente>109</agente>
                <tipo>C</tipo>
                <precio>2.5</precio>
                <tipoVenc>72</tipoVenc>
                <idOrigen>156934</idOrigen>
                <instrumento>TS</instrumento>
                <ejecucion>SINCRONICA</ejecucion>
                <agenteCtpte>3</agenteCtpte>
                <comitente>0</comitente>
                <fechaOrigen>2013-10-09T08:04:13</fechaOrigen>
                <cantidad>10</cantidad>
</orden>

但我需要以下 XML 的较短、不友好或任何格式的名称

<orden idOrigen="156934" fechaOrigen="2014-02-19T15:11:44.000-03:00" 
        agente="109" agenteCtpte="3" tipo="C" ejecucion="SINCRONICA" instrumento="TS" 
    cantidad="10" precio="2.5" formaOp="C" tipoVenc="72"/>

有什么想法吗?谢谢!

【问题讨论】:

  • 你为什么使用两个不同的 JSON 库? --- 无论如何,既然您使用 Jackson ObjectMapper 转换为 JSON,为什么不使用 JAXB 将对象转换为 XML?这样,您就可以使用 JAXB 注释完全控制 XML 生成。
  • 谢谢!我会根据你的评论给出答案

标签: java json xml converter


【解决方案1】:

根据 Andreas 发表的评论,我使用了 JAXB,我的 Orden 类现在是混合的(可以从 JSON 或 XML 转换)。

这是对象的配置方式:

@XmlRootElement
public class IngresarOrden extends DatosOferta {

    private String accion;

    private ModoEjecucion ejecucion;

    private String operador;

    @XmlAttribute
    public String getAccion() {
        return accion;
    }
    public void setAccion(String accion) {
        this.accion = accion;
    }
    @XmlAttribute
    public ModoEjecucion getEjecucion() {
        return ejecucion;
    }
    public void setEjecucion(ModoEjecucion ejecucion) {
        this.ejecucion = ejecucion;
    }
    @XmlAttribute
    public String getOperador() {
        return operador;
    }
    public void setOperador(String operador) {
        this.operador = operador;
    }

@XmlAttribute 是将值放入根标记所需的注释。

这是完整的转换器实现:

public static <T> String converToXml (T obj) throws CommonsException {

        JAXBContext jaxbContext;
        String xml = null;
        try {
            OutputStream os = new ByteArrayOutputStream();
            jaxbContext = JAXBContext.newInstance(obj.getClass());
            Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); 
            jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            jaxbMarshaller.marshal(obj, os);
            xml = os.toString();
        } catch (JAXBException e) {
            logger.error("XML converter exception: ", e);
            throw new CommonsException("XML converter exception: ", e);
        }
        return xml;
    }

谢谢!

【讨论】:

    猜你喜欢
    • 2015-04-11
    • 2016-07-17
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多