2016-04-21 1 views
1

Я использую gson для десериализации разных типов объектов, и в этих классах есть некоторые примитивные типы. Когда я десериализую объект json для этих типов, примитивные типы получают свои значения по умолчанию.gson find missing primitive fields

Итак, я использую классы-оболочки для примитивных полей, чтобы понять, было ли поле в json отсутствовать, поскольку они установлены в значение null, если значение отсутствует.

class Class{ 
    integer int1; 
} 

int1 field получает 0, если его нет в json. Поэтому у меня нет способа понять, было ли поле задано равным 0 или отсутствовало в json. Но мне нужен способ понять, присутствуют ли эти поля в json без использования класса-оболочки.

Thanks

+0

Определить «лучше ». – shmosel

+0

Мне нужен способ понять, присутствуют ли эти поля в json, даже если я определяю их как примитивные поля без классов-оболочек. –

+0

Предполагая, что вы имеете в виду 'Integer',' Boolean' и т. Д., В чем же проблема? Если вы не укажете проблему, мы не сможем ее решить. – shmosel

ответ

0

Я также сталкиваюсь с тем же вопросом.

Если вы используете примитивный тип, то его данные по умолчанию. Для целого числа 0, логического ложного и т. Д., Его не из GSON. Если вы определили какое-либо поле/переменную, у него будет определенное значение по умолчанию в памяти. Для этого я разработал решение, GSON всегда будет выглядеть в поданной форме. так что я сделал, я определил все строки. Строки или любые объекты будут содержать нули. Напишите метод getter, который вернет значение примитивного типа.

для например:

class Class{ 
    String int1; 
    public int getint1(){ 
     return int1==null?-1:Integer.parseInt(int1); 
    } 
} 
0

Это то, что я сделал после того, как исследования:

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; 
    } 
Смежные вопросы