Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jackson在编组JSON时忽略XmlElement名称/大小写_Java_Json_Xsd_Jersey_Jackson - Fatal编程技术网

Java Jackson在编组JSON时忽略XmlElement名称/大小写

Java Jackson在编组JSON时忽略XmlElement名称/大小写,java,json,xsd,jersey,jackson,Java,Json,Xsd,Jersey,Jackson,我试图从XSD->POJO->JSON开始,与UPS跟踪API一起使用,该API区分大小写。我在生成的JSON中使用Jackson 2.6.7。我看到驼峰案例名称时,我应该看到以下内容: “跟踪请求”:{ “查询编号”:“1Z12345E6205277936” } 生成的Java bean注释如下: @XmlElement(name = "TrackRequest") protected TrackRequest trackRequest; 我尝试了一些映射功能设置,例如使用\u包装器\u名称

我试图从XSD->POJO->JSON开始,与UPS跟踪API一起使用,该API区分大小写。我在生成的JSON中使用Jackson 2.6.7。我看到驼峰案例名称时,我应该看到以下内容:

“跟踪请求”:{
“查询编号”:“1Z12345E6205277936”
}

生成的Java bean注释如下:

@XmlElement(name = "TrackRequest")
protected TrackRequest trackRequest;
我尝试了一些映射功能设置,例如使用\u包装器\u名称\u作为\u属性\u名称和使用\u STD\u BEAN\u命名,但似乎没有达到预期的效果

我正在生成JSON,如下所示:

ObjectMapper mapper = new ObjectMapper();
String jsonRequest = mapper.writeValueAsString(upsRequest);
uprequest bean如下所示:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "upsSecurity",
    "trackRequest"
})
@XmlRootElement(name = "Request")
public class Request {

    @XmlElement(name = "UPSSecurity")
    protected UPSSecurity upsSecurity;
    @XmlElement(name = "TrackRequest")
    protected TrackRequest trackRequest;

    /**
     * Gets the value of the upsSecurity property.
     * 
     * @return
     *     possible object is
     *     {@link UPSSecurity }
     *     
     */
    public UPSSecurity getUPSSecurity() {
        return upsSecurity;
    }

    /**
     * Sets the value of the upsSecurity property.
     * 
     * @param value
     *     allowed object is
     *     {@link UPSSecurity }
     *     
     */
    public void setUPSSecurity(UPSSecurity value) {
        this.upsSecurity = value;
    }

    /**
     * Gets the value of the trackRequest property.
     * 
     * @return
     *     possible object is
     *     {@link TrackRequest }
     *     
     */
    public TrackRequest getTrackRequest() {
        return trackRequest;
    }

    /**
     * Sets the value of the trackRequest property.
     * 
     * @param value
     *     allowed object is
     *     {@link TrackRequest }
     *     
     */
    public void setTrackRequest(TrackRequest value) {
        this.trackRequest = value;
    }

}

根据文档,我应该得到所需的输出,除非我缺少注释中提到的内容,添加到字段中

使用Jackson 2.7.0,它对我来说运行良好:

@xmlacessortype(xmlacesstype.FIELD)
@XmlType(name=”“,proporter={“trackRequest”})
@XmlRootElement(name=“Request”)
类请求{
@xmlement(name=“TrackRequest”)
@JsonProperty(“TrackRequest”)
私有TrackRequest TrackRequest;
公开请求(){
}
公共请求(TrackRequest TrackRequest){
this.trackRequest=trackRequest;
}
}
@xmlacessortype(xmlacesstype.FIELD)
@XmlType(name=”“,proporter={“inquiryNumber”})
类跟踪请求{
@XmlElement(name=“InquiryNumber”)
@JsonProperty(“查询编号”)
私有字符串查询编号;
公共跟踪请求(){
}
公共TrackRequest(字符串查询编号){
this.inquiryNumber=inquiryNumber;
}
}
试验

Request uprequest=新请求(新跟踪请求(“1Z12345E6205277936”);
Marshaller-Marshaller=JAXBContext.newInstance(Request.class).createMarshaller();
setProperty(“jaxb.formatted.output”,Boolean.TRUE);
marshaller.marshall(uprequest,System.out);
ObjectMapper mapper=new ObjectMapper();
enable(SerializationFeature.INDENT_输出);
mapper.writeValue(System.out,uprequest);
输出


1Z12345E6205277936
{
“跟踪请求”:{
“查询编号”:“1Z12345E6205277936”
}
}

XML和JSON输出都在使用。

默认情况下不支持JAXB注释。您需要添加模块,然后使用
ObjectMapper
注册该模块

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JaxbAnnotationModule());

要使用此功能读取
spring boot
中的
@JsonProperty
xmlement
及其
Jackson2ObjectMapperBuilder
,您可以轻松创建一个Bean,随时获取生成器

@Bean
public Jackson2ObjectMapperBuilder jacksonBuilder() {
    Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
    //configure features for serialization and deserialization
    return builder;
}
现在,您可以自动连接生成器,并在需要的地方直接配置ObjectMapper:

@Component
public class MyClass {

    private ObjectMapper objectMapper;

    public MyClass(Jackson2ObjectMapperBuilder jacksonBuilder) {
        super();
        objectMapper = jacksonBuilder.build().registerModule(new JaxbAnnotationModule());
    }

    public String serialize(){
        AnyObject ao = new AnyObject();
        String json = objectMapper.writeValueAsString(ao);
        return json;
    }
}

您也可以尝试添加JSON注释,例如
@JsonProperty(“TrackRequest”)
。如果它在字段上不起作用,请尝试getter方法。我之前尝试过,它确实创建了所需的属性,但仍然创建了另一个不需要的属性。这很有效。ObjectMapper现在在没有配置其他功能的情况下准确地命名注释中指定的属性。后续:在响应XSD中,我定义了一个复杂类型,但在JSON响应中,该属性以空字符串的形式出现。是否有一个配置功能来处理这个问题,或者我应该修改我的XSD?我已经有一段时间没有使用XSD了,所以我不太确定你在说什么。但需要注意的是,Jackson并不支持所有JAXB注释。看到这一点,我确实通过这个注释获得了所需的输出,但是我更喜欢使用我熟悉的JAXB注释。