gpt4 book ai didi

使用 GSON 进行 Java 到 Json 验证

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:23:19 25 4
gpt4 key购买 nike

在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com