class A declares multiple JSON fields

前端 未结 8 748
温柔的废话
温柔的废话 2020-12-01 02:21

i have a class A which has some private fields and the same class extends another class B which also has some private fields which are in class A.

public cla         


        
相关标签:
8条回答
  • 2020-12-01 03:15

    This is a bit late, but I ran into this exact same problem as well. The only thing was that I wasn't able to modify the superclass as that code wasn't mine. The way that I resolved this was by creating an exclusion strategy that skipped any field that had a field of the same name present in a superclass. Here is my code for that class:

    public class SuperclassExclusionStrategy implements ExclusionStrategy
    {
        public boolean shouldSkipClass(Class<?> arg0)
        {
            return false;
        }
    
        public boolean shouldSkipField(FieldAttributes fieldAttributes)
        {
            String fieldName = fieldAttributes.getName();
            Class<?> theClass = fieldAttributes.getDeclaringClass();
    
            return isFieldInSuperclass(theClass, fieldName);            
        }
    
        private boolean isFieldInSuperclass(Class<?> subclass, String fieldName)
        {
            Class<?> superclass = subclass.getSuperclass();
            Field field;
    
            while(superclass != null)
            {   
                field = getField(superclass, fieldName);
    
                if(field != null)
                    return true;
    
                superclass = superclass.getSuperclass();
            }
    
            return false;
        }
    
        private Field getField(Class<?> theClass, String fieldName)
        {
            try
            {
                return theClass.getDeclaredField(fieldName);
            }
            catch(Exception e)
            {
                return null;
            }
        }
    }
    

    I then set the Serialization and Deserialization exclusion strategies in the builder as follows:

        builder.addDeserializationExclusionStrategy(new SuperclassExclusionStrategy());
        builder.addSerializationExclusionStrategy(new SuperclassExclusionStrategy());
    

    Hopefully this helps someone!

    0 讨论(0)
  • 2020-12-01 03:21

    I used GsonBuilder and ExclusionStrategy to avoid the redundant fields as below, it is simple and straight forward.

    Gson json = new GsonBuilder()
              .setExclusionStrategies(new ExclusionStrategy() {
                 @Override
                 public boolean shouldSkipField(FieldAttributes f) {
                    if(f.getName().equals("netAmountPcy")){
                       return true;
                    }
                    return false;
                 }
    
                 @Override
                 public boolean shouldSkipClass(Class<?> clazz) {
                    return false;
                 }
              }).create();
    
    0 讨论(0)
提交回复
热议问题