使用 GSON 进行 Java 到 Json 验证

标签 java json gson transformation

在使用 GSON API 将 Java 对象转换为 Json 字符串时,如果任何带注释的属性为 null,我也想使此 Json 转换失败。

例如

public class Order{

@SerializedName("orderId")
@Expose
@Required
private Integer id;

//getter & setter available for id
}

现在我正在做

Order order = new Order();

JSONObject jsonobj = new JSONObject(gson.toJson(order));

如果任何@Required 属性为空,我想使上述 Java 到 Json 的转换失败 这可能使用 GSON 吗?

最佳答案

我想让 Java 到 Json 的转换失败,如果任何 Java 属性为 null,它被注释为 @Required, 我能够使用以下方法实现此目的。如果您发现任何问题,请告诉我:

class RequiredKeyAdapterFactory implements TypeAdapterFactory {

    public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {

        final TypeAdapter<T> delegate = gson.getDelegateAdapter(this, type);

        return new TypeAdapter<T>() {
            @Override
            public void write(JsonWriter out, T value) throws IOException {
                if (value != null) {

                    Field[] fields = value.getClass().getDeclaredFields();

                    for (int i = 0; i < fields.length; i++) {
                        if (fields[i]
                                .isAnnotationPresent(Required.class)) {
                            validateNullValue(value, fields[i]);
                        }

                    }
                }
                delegate.write(out, value);
            }

            private <T> void validateNullValue(T value, Field field) {
                field.setAccessible(true);
                Class t = field.getType();
                Object v = null;
                try {
                    v = field.get(value);
                } catch (IllegalArgumentException | IllegalAccessException e) {
                    throw new IllegalArgumentException(e);
                }
                if (t == boolean.class && Boolean.FALSE.equals(v)) {
                    throw new IllegalArgumentException(field + " is null");
                } else if (t.isPrimitive()
                        && ((Number) v).doubleValue() == 0) {

                    throw new IllegalArgumentException(field + " is null");
                } else if (!t.isPrimitive() && v == null) {
                    throw new IllegalArgumentException(field + " is null");

                }
            }

            @Override
            public T read(JsonReader in) throws IOException {
                return delegate.read(in);
            }

        };
    }
}

RequiredKeyAdapterFactory requiredKeyAdapterFactory = new RequiredKeyAdapterFactory();
Gson gson = new GsonBuilder().registerTypeAdapterFactory(requiredKeyAdapterFactory)
        .create();

这是有效的

关于使用 GSON 进行 Java 到 Json 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35587252/

相关文章:

java - 从 AST 中提取信息

angularjs - 单个数组 JSON 对象不会打印 (Ionic 2)

json - 如何在 Scala 中以字符串形式读取嵌套 json 对象的一部分

java - 使用 GSON 解析 JSON 数组

java - 如何添加包含名称和名称列表的对象 MemberList?

java - 为什么必须为方法引用显式指定类/对象名称?

c# - 冲突的 Newtonsoft.Json nuget 版本。

java - Gson为什么要给String加斜杠

java - 将 postgres 文本数组转换为 java 列表?

java - 如何在构造函数中使用@Value?