Umarshall JSON对象,在Jackson和JAXB之间带有下划线和camelCase字段

Umarshall 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 = "

使用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 = "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"}