Jackson 在序列化为 JSON 时无法考虑 @XmlElement

问题描述 投票:0回答:3

我有一个合约类,其中包含带有 @XmlElement 标签的元素。对于前

 @XmlElement(name = "balancemoney")
 protected Amount balanceMoney;

使用 JAXBContext 我能够生成带有正确标签的 xml。

但是,当我使用 jackson 提供的库时,JSON 标记仍然以“balanceMoney”而不是“balancemoney”形式出现

我如何告诉 Jackson 考虑 @XmlElement 标签。

下面是执行此操作的代码。

    //Function to display request object.
public void displayXML(Object reqResp){
    try{
        JAXBContext jaxbContext = JAXBContext.newInstance(reqResp.getClass());
        Marshaller jaxbMarshaller = jaxbContext.createMarshaller();

        // output pretty printed
        jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

        ByteArrayOutputStream bStream=new ByteArrayOutputStream();

        //jaxbMarshaller.marshal(reqResp, System.out);
        jaxbMarshaller.marshal(reqResp,bStream );

        logger.info(bStream.toString());    

        }catch(JAXBException e){
            logger.info(e.getMessage());
        }
        logger.info("*** Payload is: " + reqResp.toString());
}

//Function to display as JSON
public void displayJSON(Object reqResp) throws JsonGenerationException, JsonMappingException, IOException{
    ObjectMapper mapper = new ObjectMapper();
    logger.info(mapper.defaultPrettyPrintingWriter().writeValueAsString(reqResp));

}
xml jaxb jackson
3个回答
11
投票
  • Maven 依赖项 - pom.xml:

    <dependency>
        <groupId>com.fasterxml.jackson.module</groupId>
        <artifactId>jackson-module-jaxb-annotations</artifactId>
        <version>2.6.1</version>
    </dependency>
    
  • 自定义ObjectMapper配置(取消注释所有注释以将此映射器注册为Spring中的默认值):

    //@Configuration
    public class JacksonConfig {
    
        //@Primary
        //@Bean
        public static ObjectMapper createCustomObjectMapper() {
            ObjectMapper mapper = new ObjectMapper();
            AnnotationIntrospector aiJaxb = new JaxbAnnotationIntrospector(TypeFactory.defaultInstance());
            AnnotationIntrospector aiJackson = new JacksonAnnotationIntrospector();
            // first Jaxb, second Jackson annotations
            mapper.setAnnotationIntrospector(AnnotationIntrospector.pair(aiJaxb, aiJackson));
            return mapper;
        }
    }
    
  • 显示为 JSON 的代码:

    public void displayJSON(Object reqResp) throws JsonProcessingException{
        ObjectMapper mapper = JacksonConfig.createCustomObjectMapper();
        LOG.info(mapper.writeValueAsString(reqResp));
    }
    

2
投票

根据在 Jackson 中使用 JAXB 注解启用 JAXB 注解支持,您需要设置

mapper.getDeserializationConfig().setAnnotationIntrospector(new JaxbAnnotationIntrospector());
以使 Jackson 能够使用 JAXB 注解。


0
投票

如果我们在 Jaxbclasses 中从 Javax 迁移到 Jakarta,那么下面应该可以工作

 XmlMapper xmlMapper = new XmlMapper();
      xmlMapper.registerModule(new JakartaXmlBindAnnotationModule());
© www.soinside.com 2019 - 2024. All rights reserved.