Java Jackson无法用连字符反序列化字段
在下面的代码中,结果orderObj没有合同id、订单号详细信息。它仅对带有连字符的字段进行反序列化。据我所知@jsonproperty应该映射 请帮助获取我的结果orderObj中的所有字段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
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字段名。