当前位置: 首页 > 知识库问答 >
问题:

在JSON对象中强制非空字段

阮健
2023-03-14

我们的REST API接收一些JSON对象输入,其中一些字段要求为非空。这些可以是String/Intger,甚至可能是其他一些类实例作为引用。

我们试图找到一种方法来强制这些字段不为null,而不是API中null检查的正确方法。当前:

if (myObject.getSomeOtherObject() == null)
    throw new SomeException();

我们想要的是:

class MyObject{
    @Required
    OtherObject someOtherObject;
    // ...
}

我们尝试了3件事:

1) 升级至jackson 2.0.6并使用annotation com。fasterhtml" target="_blank">xml。杰克逊。注释。JsonProperty但是,这看起来不起作用。找到了这些参考资料:http://jira.codehaus.org/browse/JACKSON-767

2) 扩展JsonDeserializer以检查null,但问题是它甚至没有在null输入上执行。

public class NotNullDeserializer<T> extends JsonDeserializer<T> {

    @Override
    public T deserialize(JsonParser jsonparser, DeserializationContext deserializationcontext) throws IOException, JsonProcessingException {

        ParameterizedType superClass = (ParameterizedType) getClass().getGenericSuperclass();
        Class<T> type = (Class<T>) superClass.getActualTypeArguments()[0];

        T t = jsonparser.readValueAs(type);

        if (t == null){
            String classNameField = type.getName();
            String field = jsonparser.getCurrentName();
            throw new WrongInputException("The field '"+field+"' of type '"+classNameField+"' should not be null.");
        }

        return t;
    }
}

public class NotNullAddressDeserializer extends NotNullDeserializer<Address> {

}

@JsonDeserialize(using=NotNullAddressDeserializer.class)
    Address to;

3) 编写我们自己的@Required注释并尝试使用ResourceFilter进行检查,但似乎我无法从ContainerRequest获取实际对象,即使我们可以,也不确定如何在对象中执行空引用的深度检查。其他对象。某个物体。fieldNotNullable

private class Filter implements ResourceFilter, ContainerRequestFilter {
    private final ArrayList<String> requiredParameters;

    protected Filter() {
        requiredParameters = null;
    }

    protected Filter(ArrayList<String> requiredParameters) {
        this.requiredParameters = requiredParameters;
    }

    @Override
    public ContainerRequestFilter getRequestFilter() {
        return this;
    }

    @Override
    public ContainerResponseFilter getResponseFilter() {
        return null;
    }


    @Override
    public ContainerRequest filter(ContainerRequest request) {
        if (requiredParameters != null && requiredParameters.size() > 0) {
            MultivaluedMap<String, String> params = request.getQueryParameters();
            params.putAll(request.getFormParameters());
            StringBuffer missingParams = new StringBuffer();
            for (String reqParam : requiredParameters) {
                List<String> paramValues = params.get(reqParam);
                if (paramValues == null || paramValues != null && paramValues.size() == 0)
                    missingParams.append(reqParam + ",");
            }
            if (missingParams.length() > 0)
                throw new WrongInputException("Required parameters are missing: " + missingParams);
        }
        return request;
    }
}

共有3个答案

狄溪叠
2023-03-14

您可以使用JSON-ScheMA,因为您可以使用它来表达JSON字段的许多约束:http://json-schema.org/

然后,您可以使用@NotNull JSR 303注释从模式生成您的java类,并在您的对象上使用bean验证。它与Jackson本机一起工作,因此您应该不会有任何问题。

例如,您可以使用maven插件来实现:http://wiki.jsonschema2pojo.googlecode.com/git/site/0.3.7/generate-mojo.html

闻人哲茂
2023-03-14

@必需是注入bean的Spring框架注释,所以我建议不要将其用于此目的。

你可以用这个来代替:

http://robaustin.wikidot.com/annotations-and-notnull

@NotNull String myString;

对于运行时检查,请尝试http://code.google.com/p/notnullcheckweaver/

施刚毅
2023-03-14

JAX-RS很好地将反序列化与验证分离开来,即JSON-B(或Jackson)在设计上没有将值强制为非空,等等的机制。相反,您可以使用BeanValidation来实现这一点:

  1. javax添加依赖项。验证:提供了范围中的验证api

更多细节,请点击这里。

 类似资料:
  • 问题内容: 我们的REST API接收一些JSON对象输入,其中某些字段必须不为null。这些可以是String / Integer,甚至可以是其他一些类实例作为参考。 我们正在尝试寻找一种方法来强制这些字段不为null,而不是在API中进行null检查的正确方法。当前: 我们想要的是这样的: 我们尝试了3件事: 1)升级到杰克逊2.0.6并使用注释com.fasterxml.jackson.an

  • 问题内容: 我们的REST API接收一些JSON对象输入,其中某些字段必须不为null。这些可以是String / Integer,甚至可以是其他一些类实例作为参考。 我们正在尝试寻找一种方法来强制这些字段不为null,而不是在API中进行null检查的正确方法。当前: 我们想要的是这样的: 我们尝试了3件事: 1)升级到杰克逊2.0.6,并使用注释com.fasterxml.jackson.a

  • 问题内容: 我有一个包含用户数据的类,如下所示: 我需要计算非字段,以显示用户已填充的配置文件的百分比。还有一些,我不希望在百分比计算要考虑几个字段:,和。 一种简单的方法是使用多个语句来获取非null字段,但这将涉及大量样板代码,并且还有一个我需要显示完成百分比的类。因此,我创建了一个实用程序函数,如下所示: 然后我按如下所示调用此函数: 我的问题是,这是我不算数字段还是可以进一步改进的最佳方法

  • 我想知道是否有一个衬里可能像这样 我只是检查名字、姓氏等是否为空。如果我有几个这样的字段呢? 因此,如果我写入,我不想用空值更新任何字段 如果我的字段为空,是否有任何可能的替代方案可以告诉object spread或任何其他内容不要更新?

  • 我经常想保存一个不能为空或空白的字符串 - 空格不够好。编译器很好地处理以防止空值,我们可以使用来检查它是空的还是空白的。但是,这要求在使用它的所有位置处理空白检查,然后在空白时处理错误,如果错过了某个位置,这可能会导致意外错误。 是否有一种更简单的方法来定义的类型或扩展名,以强制字符串不能为空?

  • 问题内容: 我很难找到一种方法来解析JSONArray。看起来像这样: 如果JSON的写法不同,我知道如何解析它(换句话说,如果我返回了json对象而不是对象数组)。但这就是我所必须拥有的。 *编辑:这是一个有效的json。我使用此json制作了一个iPhone应用,现在我需要在Android上使用它,但无法弄清楚。有很多示例,但是它们都是与JSONObject相关的。我需要JSONArray。