我正在使用 gson 反序列化不同的对象类型,这些类中有一些原始类型。当我将 json 对象反序列化为这些类型时,原始类型将获得其默认值。
因此,我使用原始字段的包装类来了解该字段是否不存在于 json 中,因为如果值丢失,它们将设置为 null。
class Class{
integer int1;
}
如果 json 中不存在 int1 字段,则其值为 0。所以我没有办法了解该字段是否设置为 0 或者不存在于 json 中。但我需要一种方法来了解这些字段是否存在于 json 中,而不使用包装类。
谢谢
最佳答案
这是我经过研究后所做的:
public class AnnotatedDeserializer<T> implements JsonDeserializer<T> {
@Override
public T deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) throws JsonParseException {
List<String> jsonFields = new ArrayList<>();
for(Map.Entry<String,JsonElement> entry : je.getAsJsonObject().entrySet()) {
jsonFields.add(entry.getKey());
}
List<String> classFields = new ArrayList<>();
List<String> optionalClassFields = new ArrayList<>();
try{
for(Field field : Arrays.asList(Class.forName(type.getTypeName()).getDeclaredFields())){
if(field.getAnnotation(OptionalField.class) == null)
classFields.add(field.getName());
else
optionalClassFields.add(field.getName());
}
}catch(Exception exception){
}
for(String field : classFields) {
if(!jsonFields.contains(field))
throw new JsonParseException("Missing field in JSON: {"
+ field + "}");
}
for(String jsonField : jsonFields)
if(!classFields.contains(jsonField) && !optionalClassFields.contains(jsonField)){
throw new JsonParseException("Unknown field in JSON: {"
+ jsonField + "}");
}
Gson gson = new GsonBuilder().create();
T target = gson.fromJson(je, type);
return target;
}
然后我将其分配给 gsonBuilder,如下所示:
public <T> RequiredFieldAwareGsonBuilder withRequiredFieldAwareType(Class<T> classOfT) {
gsonBuilder.registerTypeAdapter(classOfT, new AnnotatedDeserializer<T>());
return this;
}
关于java - gson 查找缺失的原始字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36763444/