【问题标题】:Unmarshalling JSON with unknown property with null value使用 null 值解组具有未知属性的 JSON
【发布时间】:2014-08-21 12:17:29
【问题描述】:

我正在使用 MOXy 将传入的 JSON 解组到我的 Jersey API。我有一个具有三个属性的 POJO:databaseName、initialQuery 和 runQueryAsUser。我有一个客户向我发送一个 POST,其中 JSON 有一个我不需要的附加属性,secureQuery。当secureQuery 的值为空时,MOXy 会返回一个空对象。当secureQuery 的值为空字符串时,MOXy 返回具有三个属性集的有效对象,并且secureQuery 被正确忽略。 POJO 唯一的注解是@XmlRootElement(name = "InitialQuery")

这是一个错误,还是我必须翻转某个设置?

方法签名:

public Response createSecuredQuery(final InitialQueryBean initialQuery) {

空 InitialQuery 对象:

{
    "databaseName":"MyDatabase",
    "initialQuery":"select 1",
    "runQueryAsUser":"bob",
    "secureQuery":null
}

良好的 InitialQuery 对象:

{
    "databaseName":"MyDatabase",
    "initialQuery":"select 1",
    "runQueryAsUser":"bob",
    "secureQuery":""
}

【问题讨论】:

  • 尝试使用 moxy 天真地反序列化您的任一输入会返回“在项目中未找到具有默认根元素 databaseName 的描述符”。你确定没有带有 {"InitialQuery" : {[your input]}} 的外包装 json 吗?
  • 你不能使用类似“objectMapper.getSerializationConfig().setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL)”和objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false)”的东西来处理这个吗?还有” Jackson" json 提供程序提供了两个注释,您可以在 POJO 之上使用它们,它将采用空值和未知属性。例如“@JsonInclude(Include.NON_NULL)”和“@JsonIgnoreProperties(ignoreUnknown = true)”。
  • @radai 是的,我很确定。如果是这种情况,那么两个输入都不起作用,因为它们的格式相同。
  • @ripudam 我使用的是 MOXy,而不是 Jackson。我熟悉 Jackson 的功能,但这对我的问题没有帮助。
  • 此问题存在一个错误:bugs.eclipse.org/bugs/show_bug.cgi?id=487176

标签: java jersey moxy


【解决方案1】:

我对 MOXy 不是很熟悉,但您对 @XmlRootElement 的引用表明您正在使用 JAXB 注释来控制编组。尝试将以下属性添加到您的 POJO:

@XmlAnyElement(lax="true")
public Object[] unknown; // name it whatever you want

这基本上是所有接收到但未被 POJO 中任何其他声明/注释属性覆盖的值的集合。有关详细信息,请参阅JAXB documentation

类似的@XmlAnyAttribute 也可能有用,这取决于 MOXy 如何翻译输入(到元素属性)。有一点模棱两可,因为这些注释是为编组到/从 XML 而设计的,而不是 JSON。

【讨论】:

  • 嗯,这显然不是最理想的,但至少听起来它会起作用。我希望有人回来提供更好的解决方案。
  • 除非 MOXy 提供了一个忽略未知属性的配置选项(即如 Jackson 对象映射器框架所做的那样),否则您必须采取某种“次优”的解决方法。我做了一个快速的谷歌搜索,上面详细介绍了基于方法的版本:blog.bdoughan.com/2011/06/…
【解决方案2】:

除了@XMLRootELement,对pojo中的所有属性都使用@XmlElement。

对于属性 secureQuery,使用 @XmlElement(defaultValue="")

这将提供一些值,以防它为空。

查看此链接: http://docs.oracle.com/javaee/7/api/javax/xml/bind/annotation/XmlElement.html#defaultValue%28%29

【讨论】:

  • 这没有任何意义。我不想提供财产。当客户发送给我时,我想忽略它。
  • 这在 2010 年得到解决,当我使用 MOXy 时是泽西岛。
  • 看到解决方案无法解决,他们就这样离开了。
  • 尝试使用ValidationEventHandler。请看这个链接:blog.bdoughan.com/2010/12/jaxb-and-marshalunmarshal-schema.html
猜你喜欢
  • 1970-01-01
  • 2015-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多