Java gson查找缺少的基本字段
我使用gson反序列化不同的对象类型,这些类中有一些基本类型。当我将json对象反序列化为这些类型时,基元类型将获得它们的默认值 因此,我使用原始字段的包装器类来理解json中是否不存在该字段,因为如果缺少值,它们将被设置为nullJava gson查找缺少的基本字段,java,json,gson,missing-data,primitive,Java,Json,Gson,Missing Data,Primitive,我使用gson反序列化不同的对象类型,这些类中有一些基本类型。当我将json对象反序列化为这些类型时,基元类型将获得它们的默认值 因此,我使用原始字段的包装器类来理解json中是否不存在该字段,因为如果缺少值,它们将被设置为null class Class{ integer int1; } 如果json中不存在int1字段,则该字段将获取0。因此,我无法理解该字段是设置为0还是不存在于json中。但我需要一种方法来理解这些字段是否存在于json中,而不使用包装器类 谢谢我也面临同样的问题
class Class{
integer int1;
}
如果json中不存在int1字段,则该字段将获取0。因此,我无法理解该字段是设置为0还是不存在于json中。但我需要一种方法来理解这些字段是否存在于json中,而不使用包装器类
谢谢我也面临同样的问题 我认为这与基本类型和默认值有关。我通过将所有字段定义为stringsm解决了这个问题,因为它们将保持
null
s。我编写了一个getter,它将返回一个原语类型值,但返回一个默认值以避免null
例如:
class Class{
String int1;
public int getint1(){
return int1==null?-1:Integer.parseInt(int1);
}
}
这是我在研究后做的:
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;
}
公共类AnnotatedDeserializer实现JsonDeserializer{
@凌驾
公共T反序列化(JsonElement je,类型类型,JsonDeserializationContext jdc)抛出JsonParseException{
List jsonFields=new ArrayList();
for(Map.Entry:je.getAsJsonObject().entrySet()){
添加(entry.getKey());
}
List classFields=new ArrayList();
List optionalClassFields=newarraylist();
试一试{
for(字段:Arrays.asList(Class.forName(type.getTypeName()).getDeclaredFields())){
if(field.getAnnotation(OptionalField.class)==null)
添加(field.getName());
其他的
optionalClassFields.add(field.getName());
}
}捕获(异常){
}
for(字符串字段:类字段){
如果(!jsonFields.contains(字段))
抛出新的JsonParseException(“JSON中缺少字段:{”
+字段+“}”);
}
for(字符串jsonField:jsonFields)
如果(!classFields.contains(jsonField)&&!optionalClassFields.contains(jsonField)){
抛出新的JsonParseException(“JSON中的未知字段:{”
+jsonField+“}”);
}
Gson Gson=new GsonBuilder().create();
T target=gson.fromJson(je,type);
回报目标;
}
然后我将其分配给gsonBuilder,如下所示:
public <T> RequiredFieldAwareGsonBuilder withRequiredFieldAwareType(Class<T> classOfT) {
gsonBuilder.registerTypeAdapter(classOfT, new AnnotatedDeserializer<T>());
return this;
}
public required fieldawaregsonbuilder with required fieldawaretype(classOfT类){
registerTypeAdapter(ClassSoft,新的AnnotatedDeserializer());
归还这个;
}
我需要一种方法来理解这些字段是否存在于json中,即使我将它们定义为没有包装类的基本字段。假设您指的是整数
、布尔
等,到底是什么问题?如果您不指定问题,我们无法尝试解决它。我不想使用包装类来取消derstand缺少基本字段