gpt4 book ai didi

jaxb - Umarshall JSON 对象,在 Jackson 和 JAXB 之间带有下划线和驼峰式字段

转载 作者:行者123 更新时间:2023-12-01 22:08:32 24 4
gpt4 key购买 nike

使用 JAXB (2.2) 和 Jackson (1.9.13),我无法将以下 JSON 对象解码到我的 POJO

{
"userId": "foo",
"group_id": "bar"
}

请注意,有效负载包含驼峰命名法和下划线字段。

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 绑定(bind) underscoreBinding="asCharInWord"

在我的 XML 架构中使用以下 JXB 绑定(bind)

<jxb:globalBindings underscoreBinding="asCharInWord"/>

生成以下 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 getGroup_Id() { return groupId; }
public void setGroup_Id(String value) { this.groupId = value; }
}

请注意,JAXB 现在为组 ID 生成带下划线的 setter/getter,但 group_id字段仍转换为 CamelCase。 Jackson 的对象映射器似乎忽略了属性 getter/setter 名称,并且仍然无法映射 group_idgroupId .

2。 jackson 属性(property)命名策略

使用 Jackson 的 PropertyNamingStrategy CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES我可以转换group_idgroupId ,但现在对象映射器在 userId 上失败JSON 属性。

3。添加JSONProperty groupId 的注释

添加 JSONProperty普通的 JAXB 生成的 POJO 确实可以工作

public class User {
/* ... */
@XmlElement(name = "group_id", required = true)
@JSONProperty("group_id")
protected String groupId;
/* ... */
}

但是,我的 XML 模式很大,并且手动检测生成的类是不可行的,因为我们经常生成类。

我应该做什么?

我看到以下两个剩余选项可以解决此问题:

  1. 实现一个 JAXB 插件,添加 JSONProperty每个 XMLElement 的注释带有下划线的名称(我首选的下一种方法)
  2. 使用 XJC 的自定义名称生成器,如 this 中所述。 Stackoverflow 的答案。

我是否错过了显而易见的事情?感谢您的想法。

最佳答案

您是否尝试过注释 groupId用户类中的属性 @JsonProperty("group_id") 。这应该有效(经过测试和证明)!

如果属性上不存在此类注释,Jackson 映射器将仅按原样考虑属性名称,否则提供的值将用于 JSON 反序列化。这是您的 User 的外观类:

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 Snake Case(下划线)格式的数据

https://mahichir.wordpress.com/2015/07/08/cxf-configuration-to-produce-json-snake-case-underscore-case-formatted-data-using-jackson-json-library/

关于jaxb - Umarshall JSON 对象,在 Jackson 和 JAXB 之间带有下划线和驼峰式字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21995175/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com