這就是我的研究之後完成:
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;
}
定義「更好」。 – shmosel
我需要一種方法來了解這些字段是否存在於json中,即使我將它們定義爲沒有包裝類的原始字段。 –
假設你指的是整型,布爾等,究竟是什麼問題?如果您不指定問題,我們不能嘗試解決它。 – shmosel