Umarshall JSON对象,在Jackson和JAXB之间带有下划线和camelCase字段
使用JAXB(2.2)和Jackson(1.9.13),我很难将以下JSON对象解组到POJOUmarshall JSON对象,在Jackson和JAXB之间带有下划线和camelCase字段,jaxb,jackson,Jaxb,Jackson,使用JAXB(2.2)和Jackson(1.9.13),我很难将以下JSON对象解组到POJO { "userId": "foo", "group_id": "bar" } 请注意,有效负载包含camelCase和下划线字段 xjc为我的XML模式生成的POJO如下所示: public class User { @XmlElement(required = true) protected String userId; @XmlElement(name = "
{
"userId": "foo",
"group_id": "bar"
}
请注意,有效负载包含camelCase和下划线字段
xjc为我的XML模式生成的POJO如下所示:
public class User {
@XmlElement(required = true)
protected String userId;
@XmlElement(name = "group_id", required = true)
protected String groupId;
public String getUserId() { return userId; }
public void setUserId(String value) { this.userId = value; }
public String getGroupId() { return groupId; }
public void setGroupId(String value) { this.groupId = value; }
}
Jackson失败,但出现以下异常:
org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "group_id"
到目前为止我所做的一切都失败了
1.使用JAXB绑定下划线binding=“asCharInWord”
在我的XML模式中使用以下JXB绑定
<jxb:globalBindings underscoreBinding="asCharInWord"/>
注意,JAXB现在为组id生成带下划线的setter/getter,但是group\u id
字段仍然转换为CamelCase。Jackson的对象映射器似乎忽略了属性getter/setter名称,仍然无法将groupId
映射到groupId
2.Jackson属性命名策略
使用Jackson的带有下划线的CAMEL\u CASE\u TO \u LOWER\u CASE\u,我可以将group\u id
转换为groupId
,但现在对象映射器在userId
JSON属性上失败
3.将JSONProperty
注释添加到groupId
将JSONProperty
添加到普通JAXB生成的pojo实际上是可行的
public class User {
/* ... */
@XmlElement(name = "group_id", required = true)
@JSONProperty("group_id")
protected String groupId;
/* ... */
}
然而,我的XML模式非常庞大,手动插入生成的类是不可行的,因为我们经常生成类
我该怎么办?
我看到了处理此问题剩下的两个选项:
实现一个JAXB插件,该插件使用下划线名称向每个XMLElement
添加JSONProperty
注释(我首选的下一种方法)
如Stackoverflow answer中所述,为XJC使用自定义名称生成器
我是否错过了显而易见的机会?
谢谢您的想法。我从stackoverflow的一个类似案例中找到了解决您问题的可能方法。
访问对象映射器后,可以设置自己的注释提供程序。由于jackson 2.0是jaxb模块,所以现在已将其作为一个单独的模块删除
这里是答案,尽管我对其进行了修改,使其符合Jackson模块Jaxb 2.4.4和Jackson API 2.3.2:
public final static JacksonJsonProvider JACKSON_JSON_PROVIDER = new JacksonJaxbJsonProvider().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false).configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
public final static ObjectMapper OBJECT_MAPPER = JACKSON_JSON_PROVIDER.locateMapper(Object.class, MediaType.APPLICATION_JSON_TYPE);
public final static Client CLIENT = ClientBuilder.newClient().register(JACKSON_JSON_PROVIDER);
这需要jar:jackson-module-jaxb-annotations-2.x.x.jar,以便jackson可以通过接口JacksonJaxbProvider在后台加载它
对于您的Jackson版本,我认为jaxb代码仍然存在。因此,您可以使用参考类似的方法。您是否尝试过使用@JsonProperty(“group\u id”)
注释用户类中的groupId
属性。这应该有效(经过测试和验证)
如果在属性上不存在这样的注释,杰克逊映射器将只考虑属性名称,否则所提供的值将用于JSON反序列化。以下是您的
用户
类的外观:
public class User {
private String userId;
@JsonProperty("group_id")
private String groupId;
这应该映射到您的JSON
{"userId": "foo","group_id": "bar"}
如果您使用的是基于Jackson的CXF(或任何其他Rest框架),我建议您阅读以下短文,详细介绍如何在CXF中配置JacksonJsonProvider,以实现从/到Java从/到JSON蛇格(下划线)格式数据的序列化和反序列化
这符合“仅链接”回答-也许您可以进行编辑以包含链接资源中最适当的代码段/文本片段?
{"userId": "foo","group_id": "bar"}