gson java中是否有一个函数来检查是否有json属性为空?

z9gpfhce  于 2022-11-06  发布在  Java
关注(0)|答案(1)|浏览(177)

我有一个JSON的消息,我将其转换为JSONObject,并且我有大约30个必填字段,我必须检查它们是否为空。如果其中一个必填字段为空,我将丢弃该消息,但是其他字段可以为空而无需丢弃该消息。有没有一种高效的方法可以做到这一点,而不必遍历每个字段并使用isNull()
此外,JSON对象是嵌套的,因此简单的anyNull()函数将不起作用,因为它只在对象本身为空时返回,而在变量本身为空时不返回。
我尝试使用gson将消息转换为POJO,并为10个对象创建了类

Gson gson = new Gson();
Message message = gson.fromJson(msg, Message.class);

但由于许多类是嵌套的(其中一个类是对象数组),因此使用简单的空检查器是行不通的。

zzlelutf

zzlelutf1#

实际上,说你的问题并不是很清楚,因为你使用的“消息”一词指的是你的特定类,但也可以是更通用的,指的是发送/接收的消息。
内存中的JSON元素:

public static void failOnNullRecursively(final JsonElement jsonElement) {
    if ( jsonElement.isJsonNull() ) {
        throw new IllegalArgumentException("null!");
    }
    if ( jsonElement.isJsonPrimitive() ) {
        return;
    }
    if ( jsonElement.isJsonArray() ) {
        for ( final JsonElement element : jsonElement.getAsJsonArray() ) {
            failOnNullRecursively(element);
        }
        return;
    }
    if ( jsonElement.isJsonObject() ) {
        for ( final Map.Entry<String, JsonElement> e : jsonElement.getAsJsonObject().entrySet() ) {
            failOnNullRecursively(e.getValue());
        }
        return;
    }
    throw new AssertionError(jsonElement);
}

或JSON文档:

public final class FailOnNullJsonReader
        extends JsonReader {

    private FailOnNullJsonReader(final Reader reader) {
        super(reader);
    }

    public static JsonReader create(final Reader reader) {
        return new FailOnNullJsonReader(reader);
    }

    @Override
    public void nextNull() {
        throw new IllegalStateException(String.format("null at %@!", getPath()));
    }

}

它们都将在null上抛出。但是,您似乎还希望验证Message示例:
如果其中一个必填字段为空,我将丢弃该消息,但是其他字段可以为空,而无需丢弃该消息。
这就说明了为什么上面的空值检查不能满足你的需要。你要找的是JSR-303。它可能没有你希望的那么高效(消息示例是反序列化的,验证也需要时间和资源),但是从编码的Angular 来看,它可能是高效的:

final Set<ConstraintViolation<V>> violations = validator.validate(message);
if ( !violations.isEmpty() ) {
    throw new ConstraintViolationException(violations);
}

或者甚至将其集成到Gson中,以便为中间件提供服务:
第一个
和测试(使用Lombok岛为简洁):
第一个
最后,可能是最有效的(就阅读JSON流而言),但与JSR-303相比非常有限(并且在Gson中工作,因为Gson不将空值检查传播到下游(反)序列化程序),可以用类似的“功能性”注解替换@NotNull的方法:
第一个
第三个,JSR-303,看起来最适合你。

相关问题