Java 将具有空值的未知属性的JSON解组

Java 将具有空值的未知属性的JSON解组,java,jersey,moxy,Java,Jersey,Moxy,我正在使用MOXy将传入的JSON解组到我的Jersey API。我有一个具有三个属性的POJO:databaseName、initialQuery和runQueryAsUser。我有一个客户端向我发送了一篇帖子,其中JSON有一个我不需要的附加属性secureQuery。当secureQuery的值为null时,MOXy会吐回null对象。当secureQuery的值为空字符串时,MOXy返回一个设置了三个属性的有效对象,并且secureQuery被正确忽略。POJO唯一的注释是@XmlRoo

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

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

方法签名:

public Response createSecuredQuery(final InitialQueryBean initialQuery) {
Null InitialQuery对象:

{
    "databaseName":"MyDatabase",
    "initialQuery":"select 1",
    "runQueryAsUser":"bob",
    "secureQuery":null
}
{
    "databaseName":"MyDatabase",
    "initialQuery":"select 1",
    "runQueryAsUser":"bob",
    "secureQuery":""
}
好的初始查询对象:

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

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

@XmlAnyElement(lax="true")
public Object[] unknown; // name it whatever you want
这基本上是POJO中任何其他声明/注释属性所接收但未涵盖的任何值的总括。有关更多详细信息,请参阅


类似的
@XmlAnyAttribute
也可能有用,这取决于MOXy将输入转换为元素或属性的方式。有一点模棱两可,因为这些注释是为与XML(而不是JSON)之间的编组而设计的。

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

对于属性secureQuery,请使用@xmlement(defaultValue=“”)

如果为空,这将提供一些值

请参阅此链接:

尝试使用moxy简单地反序列化输入时,返回“在项目中找不到具有默认根元素databaseName的描述符”。你确定没有带{“InitialQuery”:{[你的输入]}}的外包装json吗?你能不能使用类似“objectMapper.getSerializationConfig().setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL)”和objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_属性,false)”的东西来处理这个问题?还有“Jackson”“json提供程序提供了两个注释,您可以在POJO上使用它们,它将使用空值和未知属性。比如“@JsonInclude(Include.NON_NULL)”和“@JsonIgnoreProperties(ignoreUnknown=true)”。@radai是的,我肯定。如果是这样的话,那么两个输入都不起作用,因为它们的格式相同。@ripudam我使用的是MOXy,不是Jackson。我很熟悉Jackson的功能,但这对我的问题没有帮助。这个问题有一个漏洞:那没有任何意义。我不想提供财产。当客户端发送给我时,我想忽略它。这是在2010年解决的,在我使用MOXy时是Jersey。请看解决方案是Wonnt fix,他们就这样离开了。尝试使用ValidationEventHandler。请看以下链接:嗯,这显然是次优的,但至少听起来它会起作用。我希望有人能提供更好的解决方案。除非MOXy提供了一个忽略未知属性的配置选项(如Jackson对象映射器框架),否则您必须采取某种“次优”的解决方法。我在谷歌上快速搜索了一下,下面详细介绍了上面基于方法的版本: