【问题标题】:gson serialize null values for some fields onlygson 仅序列化某些字段的空值
【发布时间】:2018-06-11 08:11:13
【问题描述】:

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

gsonBuilder.serializeNulls();

这样空值就不会被忽略。但是在某些APIs 中,我有一个特殊情况,其中一些字段即使是空值也应该存在,而其他一些字段如果为空值则不应序列化。

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

class Request {
    String id;
    String type;
}

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

{
    id : null
}     

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

目前它正在像这样序列化:

{
     id : null, 
     type:null
}  

因为我已经给了 gsonBuilder.serializeNulls(); 。我该如何处理这种特殊情况?

【问题讨论】:

标签: java android gson


【解决方案1】:

这是我的代码:

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;
    }

}

【讨论】:

    猜你喜欢
    • 2012-10-18
    • 2017-09-21
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多