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

时间:2018-06-11 08:11:14

标签: java android gson

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

gsonBuilder.serializeNulls();

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

例如,如果我有一个像

这样的请求类
class Request {
    String id;
    String type;
}

如果我有id=nulltype=null请求,gson应将其序列化为:

{
    id : null
}     

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

目前正在序列化如下:

{
     id : null, 
     type:null
}  

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

1 个答案:

答案 0 :(得分: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;
    }

}