如何在没有JAXBElement包装的情况下JSON编组JAXBElement包装的响应?

 gigi-dd 发布于 2023-01-10 11:48

我有一个使用Spring(v4.0.5)的http服务.它的http端点是使用Spring Web MVC配置的.响应是由模式生成的JAXB2-anotated类.响应被包装在内,JAXBElement因为生成的JAXB类没有运动@XmlRootElement注释(并且模式不能修改为医生).我不得不打了一下有越来越XML编组TI工作; 无论如何,它正在发挥作用.

现在我正在设置JSON编组.我遇到的是获取具有JAXBElement"信封" 特征的JSON文档.

{
  "declaredType": "io.github.gv0tch0.sotaro.SayWhat",
  "globalScope": true,
  "name": "{urn:io:github:gv0tch0:sotaro}say",
  "nil": false,
  "scope": "javax.xml.bind.JAXBElement$GlobalScope",
  "typeSubstituted": false,
  "value": {
    "what": "what",
    "when": "2014-06-09T15:56:46Z"
  }
}

我想要编组的只是 - 对象value:

{
  "what": "what",
  "when": "2014-06-09T15:56:46Z"
}

这是我的JSON编组配置(弹簧上下文配置的一部分):


  
  



  
    
      
      
        
          
        
      
    
  

我希望这可以通过配置来实现ObjectMapper.我想也可以推出我自己的序列化器.思考?建议?

1 个回答
  • 您可以为JAXBElement类注册一个mixin注释,它将@JsonValue注释放在JAXBElement.getValue()方法上,使其返回值为JSON表示.这是一个例子:

    给出的示例.xsd chema文件xjc.

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    
    <xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <xs:element name="item" type="Thing"/>
    
        <xs:complexType name="Thing">
            <xs:sequence>
                <xs:element name="number" type="xs:long"/>
                <xs:element name="string" type="xs:string" minOccurs="0"/>
            </xs:sequence>
        </xs:complexType>
    
    </xs:schema>
    

    Java主类:

    public class JacksonJAXBElement {
        // a mixin annotation that overrides the handling for the JAXBElement
        public static interface JAXBElementMixin {
            @JsonValue
            Object getValue();
        }
    
        public static void main(String[] args) throws JAXBException, JsonProcessingException {
            ObjectFactory factory = new ObjectFactory();
            Thing thing = factory.createThing();
            thing.setString("value");
            thing.setNumber(123);
            JAXBElement<Thing> orderJAXBElement = factory.createItem(thing);
    
            System.out.println("XML:");
            JAXBContext jc = JAXBContext.newInstance(Thing.class);
            Marshaller marshaller = jc.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
            marshaller.marshal(orderJAXBElement, System.out);
            System.out.println("JSON:");
    
            ObjectMapper mapper = new ObjectMapper();
            mapper.addMixInAnnotations(JAXBElement.class, JAXBElementMixin.class);
            System.out.println(mapper.writerWithDefaultPrettyPrinter()
                    .writeValueAsString(orderJAXBElement));
        }
    }
    

    输出:

    XML:
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <item>
        <number>123</number>
        <string>value</string>
    </item>
    JSON:
    {
      "number" : 123,
      "string" : "value"
    }
    

    2023-01-10 11:51 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有