2014-03-31 21 views
4

我試圖使用Gson序列化/反序列化。我不希望超類(這是抽象的)被考慮,問題是我沒有訪問超類代碼。我該如何讓gson排除我的對象的超類?

我試過用ExclusionStrategy,但它沒有奏效。

private class SuperClassExclusionStrategy implements ExclusionStrategy { 

     @Override 
     public boolean shouldSkipClass(Class<?> clazz) { 
      return clazz.equals(SuperClass.class); 
     } 

     @Override 
     public boolean shouldSkipField(FieldAttributes field) { 
      return false; 
     } 

    } 

我該如何解決這個問題?

編輯:

我需要在超類中的字段被忽略,這是因爲我得到這個錯誤:MyClass declares multiple JSON fields named。 我無法更改衝突的字段名稱。

解決方案:

與以下策略解決:

private static class SuperClassExclusionStrategy implements ExclusionStrategy { 

    public boolean shouldSkipClass(Class<?> clazz) { 
    return false; 
    } 

    public boolean shouldSkipField(FieldAttributes field) { 
    return field.getDeclaringClass().equals(MySuperClass.class) && field.getName() 
    .equals("id"); 
    } 
} 
+0

好工作...... –

回答

6

Gson documentation

Exclude fields and objects based on a particular class type:

private static class SpecificClassExclusionStrategy implements ExclusionStrategy { 
    private final Class<?> excludedThisClass; 

    public SpecificClassExclusionStrategy(Class<?> excludedThisClass) { 
     this.excludedThisClass = excludedThisClass; 
    } 

    public boolean shouldSkipClass(Class<?> clazz) { 
     return excludedThisClass.equals(clazz); 
    } 

    public boolean shouldSkipField(FieldAttributes f) { 
     return excludedThisClass.equals(f.getDeclaringClass()()); 
    } 
} 
+0

'getDeclaringClass'做這個工作不是'getDeclaredClass' – fwonce

+0

@RenéLink不,OP想要排除特定類的所有字段,而不是某些類型的字段。如果Clazz類的所有字段都被排除,那麼我們應該使用「f.getDeclaringClass()== Clazz.class」,而不是「f.getDeclaredClass()== String 。類」。 – derenio

+0

@derenio是的,你是對的。我更新了我的答案。 –

相關問題