【问题标题】:GSON skip class if object in class is empty/null如果类中的对象为空/null,则 GSON 跳过类
【发布时间】:2023-03-14 04:19:01
【问题描述】:

我目前正在为我的不和谐机器人编写权限系统。 我面临的问题是 JSON 中充满了“空”对象。

我想跳过这些对象

        "userId": {
          "userName": "RandomDiscord Name",
          "permissions": []
        },

但要保留这样的对象

        "userId": {
          "userName": "RandomDiscord Name",
          "permissions": [
                "some.permission.string",
                "some.permission.string2",
                "some.permission.string3",
          ]
        },

我尝试获取ExclusionStrategy => shouldSkipClass(Class<?> aClass),在那里我可以检查该课程的内容。喜欢

@Override
public boolean shouldSkipClass(Class<?> aClass) {
    if(aClass instanceof PermissionUser){
        PermissionUser user = (PermissionUser) aClass;
        return user.getPermissions().isEmpty();
    }
    return false;
}

但这不起作用,因为我不会得到实例,只有类的类型,所以我不能转换它。

谁能指出我正确的方向? (对我好一点,白天当救护人员,编程只是一种爱好)

【问题讨论】:

    标签: java json gson


    【解决方案1】:

    好的,我找到了办法。

     Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation()
                    .registerTypeAdapter(PermissionUser.class, new PermissionUserAdapter())
                    .registerTypeAdapter(PermissionGroup.class, new PermissionGroupAdapter())
                    .setPrettyPrinting().create();
    

    适配器看起来像这样。

    public class PermissionUserAdapter implements JsonSerializer<PermissionUser> {
        @Override
        public JsonElement serialize(PermissionUser src, Type typeOfSrc, JsonSerializationContext context) {
            if(!src.getPermissions().isEmpty() && src.getPermissions() != null){
                Gson gson = new GsonBuilder().setPrettyPrinting().excludeFieldsWithoutExposeAnnotation().create();
                return gson.toJsonTree(src);
            }
            return null;
        }
    }
    

    一旦我找到了正确的方向,就很简单了。如果有人有更好的想法,请随时纠正我。

    【讨论】:

    • * 交换&amp;&amp; 操作数以摆脱潜在的NullPointerException。 * serialize 方法最好返回JsonNull.INSTANCE(参见null-object)。 * 每次调用serialize 方法时创建多个Gson 实例会浪费堆。只需创建Gson 实例private static finalSerializationContext 不幸导致StackOverflowError
    • 如果您对更高效、更灵活的解决方案感兴趣,请在此处找到:pastebin.com/k6Nbaiff。 pastebin.com 上的粘贴将在一个月内处理完毕。
    • 谢谢蓬松!我回家后试试看?
    猜你喜欢
    • 1970-01-01
    • 2019-12-19
    • 2018-08-20
    • 2014-12-10
    • 1970-01-01
    • 2014-12-12
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多