Gson: How to exclude specific fields from Serialization without annotations

后端 未结 15 1448
后悔当初
后悔当初 2020-11-22 05:39

I\'m trying to learn Gson and I\'m struggling with field exclusion. Here are my classes

public class Student {    
  private Long                id;
  privat         


        
15条回答
  •  别那么骄傲
    2020-11-22 06:21

    This what I always use:

    The default behaviour implemented in Gson is that null object fields are ignored.

    Means Gson object does not serialize fields with null values to JSON. If a field in a Java object is null, Gson excludes it.

    You can use this function to convert some object to null or well set by your own

         /**
       * convert object to json
       */
      public String toJson(Object obj) {
        // Convert emtpy string and objects to null so we don't serialze them
        setEmtpyStringsAndObjectsToNull(obj);
        return gson.toJson(obj);
      }
    
      /**
       * Sets all empty strings and objects (all fields null) including sets to null.
       *
       * @param obj any object
       */
      public void setEmtpyStringsAndObjectsToNull(Object obj) {
        for (Field field : obj.getClass().getDeclaredFields()) {
          field.setAccessible(true);
          try {
            Object fieldObj = field.get(obj);
            if (fieldObj != null) {
              Class fieldType = field.getType();
              if (fieldType.isAssignableFrom(String.class)) {
                if(fieldObj.equals("")) {
                  field.set(obj, null);
                }
              } else if (fieldType.isAssignableFrom(Set.class)) {
                for (Object item : (Set) fieldObj) {
                  setEmtpyStringsAndObjectsToNull(item);
                }
                boolean setFielToNull = true;
                for (Object item : (Set) field.get(obj)) {
                  if(item != null) {
                    setFielToNull = false;
                    break;
                  }
                }
                if(setFielToNull) {
                  setFieldToNull(obj, field);
                }
              } else if (!isPrimitiveOrWrapper(fieldType)) {
                setEmtpyStringsAndObjectsToNull(fieldObj);
                boolean setFielToNull = true;
                for (Field f : fieldObj.getClass().getDeclaredFields()) {
                  f.setAccessible(true);
                  if(f.get(fieldObj) != null) {
                    setFielToNull = false;
                    break;
                  }
                }
                if(setFielToNull) {
                  setFieldToNull(obj, field);
                }
              }
            }
          } catch (IllegalAccessException e) {
            System.err.println("Error while setting empty string or object to null: " + e.getMessage());
          }
        }
      }
    
      private void setFieldToNull(Object obj, Field field) throws IllegalAccessException {
        if(!Modifier.isFinal(field.getModifiers())) {
          field.set(obj, null);
        }
      }
    
      private boolean isPrimitiveOrWrapper(Class fieldType)  {
        return fieldType.isPrimitive()
            || fieldType.isAssignableFrom(Integer.class)
            || fieldType.isAssignableFrom(Boolean.class)
            || fieldType.isAssignableFrom(Byte.class)
            || fieldType.isAssignableFrom(Character.class)
            || fieldType.isAssignableFrom(Float.class)
            || fieldType.isAssignableFrom(Long.class)
            || fieldType.isAssignableFrom(Double.class)
            || fieldType.isAssignableFrom(Short.class);
      }
    

提交回复
热议问题