Java Jackson无法用连字符反序列化字段

Java Jackson无法用连字符反序列化字段,java,json,jackson-databind,Java,Json,Jackson Databind,在下面的代码中,结果orderObj没有合同id、订单号详细信息。它仅对带有连字符的字段进行反序列化。据我所知@jsonproperty应该映射 请帮助获取我的结果orderObj中的所有字段 import com.fasterxml.jackson.annotation.JsonProperty; public class Order implements Serializable { private static final long serialVersionUID = 679

在下面的代码中,结果orderObj没有合同id、订单号详细信息。它仅对带有连字符的字段进行反序列化。据我所知@jsonproperty应该映射

请帮助获取我的结果orderObj中的所有字段

import com.fasterxml.jackson.annotation.JsonProperty;

public class Order implements Serializable {

    private static final long serialVersionUID = 6791737023394030929L;

    @JsonProperty("id")
    private String id;

    @JsonProperty("contract-id")
    private String contractId;

    @JsonProperty("order-number")
    private String orderNumber;
}


final ObjectMapper mapper = new ObjectMapper();
mapper.setAnnotationIntrospector(new JaxbAnnotationIntrospector(mapper.getTypeFactory()));
mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true);

Response response = orderServiceTarget.queryParam("contract-id",contractId).request().accept(MediaType.APPLICATION_JSON).headers(headersMap).get();
final String serverResponseStr = response.readEntity(String.class);
Order  orderObj = objectMapper.readValue(serverResponseStr, Order.class); 
结果对象为:缺少其他字段

{
    "id": "7FABA1724B8F15306447852233",
}
以下是服务器响应:

{
    "id": "7FABA1724B8F15306447852233",
    "contract-id": "42BAD9AAA5231BD",
    "order-number": "ADD",
    "market-segment": "COM",
}

如评论中所述,您的
对象映射器
似乎配置为使用
JaxbAnnotationIntrospector
,它将查找例如
@xmlement
而不是
@JsonProperty
id
字段仍然有效,因为它的字段名在JSON和Java之间匹配

您只需删除以下行即可解决此问题:

mapper.setAnnotationIntrospector(new JaxbAnnotationIntrospector(mapper.getTypeFactory()));

在帖子中添加了服务器响应。我注意到您使用的是
JaxbAnnotationIntrospector
,而不是JAXB注释,例如
@xmlement
-这是故意的吗?太棒了。你指对了。我正在处理两个不同的用例,这里也使用了相同的代码。成功了。请在回答部分发表评论,我会接受。虽然我收到了回复,但在mapper.readValue()之后,回复对象字段有连字符,例如:“订单号”:“添加”,“市场细分”:“COM”。应该将其转换为camelcase,因为它在Order.java中用jsonproperty映射。“我遗漏了什么吗?”基兰我想这是意料之中的行为。
@JsonProperty
指定的名称是JSON格式的预期字段名。如果您想要camelcase JSON字段名,您可以在
@JsonProperty
中更改名称,或者删除它们,Jackson将默认使用Java字段名。