Gson Serialize field only if not null or not empty

后端 未结 3 1244
孤城傲影
孤城傲影 2020-11-27 17:55

I have requirement where I need to convert java object to json.

I am using Gson for that but i need the converter to only serialize the non null or not empty values.

3条回答
  •  自闭症患者
    2020-11-27 18:19

    What I personally don't like in TypeAdapter using answer is the fact you need to describe every field of your entire class which could have lets say 50 fields (which means 50 if blocks in TypeAdapter).
    My solution is based on Reflection and a fact Gson will not serialize null values fields by default.
    I have a special class which holds data for API to create document called DocumentModel, which has about 50 fields and I don't like to send String fields with "" (empty but not null) values or empty arrays to server. So I created a special method which returns me a copy of my object with all empty fields nulled. Note - by default all arrays in my DocumentModel instance are initialized as empty (zero length) arrays and thus they are never null, you should probably check your arrays for null before checking their length.

    public DocumentModel getSerializableCopy() {
        Field fields[] = new Field[]{};
        try {
            // returns the array of Field objects representing the public fields
            fields = DocumentModel.class.getDeclaredFields();
        } catch (Exception e) {
            e.printStackTrace();
        }
        DocumentModel copy = new DocumentModel();
        Object value;
        for (Field field : fields) {
            try {
                value = field.get(this);
                if (value instanceof String && TextUtils.isEmpty((String) value)) {
                    field.set(copy, null);
                // note: here array is not being checked for null!
                else if (value instanceof Object[] && ((Object[]) value).length == 0) {
                    field.set(copy, null);
                } else
                    field.set(copy, value);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return copy;
    }
    

    Using this method I don't care if some fields was added or removed after this method was written or whatever. The only problem left - is checking custom type fields, which are not String or array, but this depends to particular class and should be extra coded in if/else blocks.

提交回复
热议问题