首页 文章

gson仅序列化某些字段的空值

提问于
浏览
-1

我正在使用Gson进行改造 . 我的服务器接受空值,所以在我给出的gson构建器中

gsonBuilder.serializeNulls();

因此不会忽略空值 . 但是在某些情况下,我有一个特例,其中一些字段应该存在,即使它是null,如果它是null,其他一些字段也不应该序列化 .

例如,如果我有一个请求类

class Request {
    String id;
    String type;
}

如果我有一个请求 id=nulltype=nullgson 应序列化它像:

{
    id : null
}

这意味着,如果type为null,则应忽略该字段,但如果id为null,则它应在请求中显示为null .

目前正在序列化如下:

{
     id : null, 
     type:null
}

因为我给了 gsonBuilder.serializeNulls(); . 我该如何处理这个特例?

1 回答

  • 0

    这是我的代码:

    public static void main(String[] args) throws SecurityException,
                NoSuchFieldException, ClassNotFoundException {
            GsonBuilder gson = new GsonBuilder();
            Request request = new Request();
            Gson g = gson.serializeNulls()
                    .setExclusionStrategies(new TestExclStrat(request)).create();
            System.out.println(g.toJson(request));
        }
    
    class Request {
        public String id;
        public String type;
    }
    
    class TestExclStrat implements ExclusionStrategy {
    
        private Object obj;
    
        public TestExclStrat(Object obj) throws SecurityException,
                NoSuchFieldException, ClassNotFoundException {
            this.obj = obj;
        }
    
        public boolean shouldSkipClass(Class<?> arg0) {
            return false;
        }
    
        public boolean shouldSkipField(FieldAttributes f) {
            if (obj instanceof Request) {
                System.out.println(f.getName());
                if (!"id".equals(f.getName())) {
                    try {
                        Field field = obj.getClass().getDeclaredField(f.getName());
                        field.setAccessible(true);
                        if (field.get(obj) == null) {
                            return true;
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
            return false;
        }
    
    }
    

相关问题