Java 将具有空值的未知属性的JSON解组
我正在使用MOXy将传入的JSON解组到我的Jersey API。我有一个具有三个属性的POJO:databaseName、initialQuery和runQueryAsUser。我有一个客户端向我发送了一篇帖子,其中JSON有一个我不需要的附加属性secureQuery。当secureQuery的值为null时,MOXy会吐回null对象。当secureQuery的值为空字符串时,MOXy返回一个设置了三个属性的有效对象,并且secureQuery被正确忽略。POJO唯一的注释是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
@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对象映射器框架),否则您必须采取某种“次优”的解决方法。我在谷歌上快速搜索了一下,下面详细介绍了上面基于方法的版本: