当前位置: 首页 > 知识库问答 >
问题:

ObjectMapper setSerialization包容(JsonInclude.Include.NON_NULL)设置不反映[重复]

魏彦
2023-03-14

对象映射程序仍包含空值。我尝试了很多在这里找到的解决方案,但都没有用。我不能使用json注释,所以我唯一的解决方案是mapper的预定义设置,但是这没有反映出来。我认为这是由于对象映射器的缓存。但是我对映射器的唯一修改是在构造函数中进行的。所以缓存不是问题

依赖关系:

Log4J2: 2.17.1
Fasterxml Jackson annotation: 2.13.2
Fasterxml Jackson databind: 2.13.2
Wildfly: 20.0.1
OpenJDK: 11.0.14.1

我有一个定义为全局值的objectMapper,它在构造函数中被实例化。然后我有一个方法来构建接受键和值的JSON。因为价值可以由任何东西决定。

private final ObjectMapper jsonMapper;

public SomeConstructor() {
    this.jsonMapper = new ObjectMapper();
    this.jsonMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    this.jsonMapper.setDefaultPropertyInclusion(JsonInclude.Include.NON_NULL);
}

@Override
public void setJsonVar(String jsonVar, String jsonKey, Object values) {

    // loads ObjectNode from memory if exists
    ObjectNode jsonNode = getJsonVar(jsonVar);

    // lazy init if ObjectNode not exists
    if (jsonNode == null) {
        jsonNode = jsonMapper.createObjectNode();
    }
    // add object
    jsonNode.putPOJO(jsonKey, values);
}

用法:

setJsonVar("var-A", "key-A", 1);
setJsonVar("var-A", "key-B", null);
print("var-a");

期望:

我想在JSON中避免空值。

预期:var-A:{"key-A": 1}得到:var-A:{"key-A": 1,"key-B": null}

为什么会发生这种情况?我能做些什么来解决这个问题?

共有1个答案

戚锦
2023-03-14

例如,此选项适用于序列化对象、自定义对象或 Map 时,但不适用于使用 json 树时。考虑这个 Foo 类:

public class Foo {

    private String id;
    private String name;

    //getters and setters
}

排除空值的选项将按预期使用它。

说明它的主要方法:

public class Main {

    public static void main(String[] args) throws Exception {
        serializeNulls();
        System.out.println();
        doNotSerializeNulls();
    }

    private static void serializeNulls() throws Exception {
        ObjectMapper jsonMapper = new ObjectMapper();
        Foo foo = new Foo();
        foo.setId("id");
        System.out.println("Serialize nulls");
        System.out.println(jsonMapper.writeValueAsString(foo));

        Map<String, Object> map = new LinkedHashMap<>();
        map.put("key1", "val1");
        map.put("key2", null);
        System.out.println(jsonMapper.writeValueAsString(map));
    }

    private static void doNotSerializeNulls() throws Exception {
        ObjectMapper jsonMapper = new ObjectMapper();
        jsonMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        jsonMapper.setDefaultPropertyInclusion(JsonInclude.Include.NON_NULL);

        Foo foo = new Foo();
        foo.setId("id");
        System.out.println("Do not serialize nulls");
        System.out.println(jsonMapper.writeValueAsString(foo));

        Map<String, Object> map = new LinkedHashMap<>();
        map.put("key1", "val1");
        map.put("key2", null);
        System.out.println(jsonMapper.writeValueAsString(map));
    }
}
 类似资料:
  • 问题内容: 我正在尝试学习钩子,该方法使我感到困惑。我正在将初始值分配给数组形式的状态。即使使用或,in中的set方法对我也不起作用。我已经在另一台PC上创建了一个API,该API正在调用并获取要设置为状态的数据。 这是我的代码: 的以及不工作。可以在这里使用一些帮助。 我希望将结果变量推入movies数组中。 问题答案: 类似于通过扩展或创建的Class组件中的setState,使用钩子提供的更

  • 为了测试不同时区的影响,我更改了日期 我的手机已连接到Wifi,但未登录到移动网络。 这是预期的行为吗?我不确定下面的“本地”指的是什么: 构造一个DateTime实例,其中包含本地时区中的当前日期和时间。 还有其他方法可以获得电话时间吗? 颤振医生 示例应用程序

  • 4.5.1 rosrun设置话题重映射 rosrun名称重映射语法: rorun 包名 节点名 话题名:=新话题名称 实现teleop_twist_keyboard与乌龟显示节点通信方案由两种: 1.方案1 将 teleop_twist_keyboard 节点的话题设置为/turtle1/cmd_vel 启动键盘控制节点:rosrun teleop_twist_keyboard teleop_tw

  • 它要做什么 该设置指定了 FreeMarker 的版本号,那么就不会100%向后兼容bug修复和改进 你想要启用 已经实现的内容。 通常来说,默认把它留在2.3.0(最大向后兼容版本)是一个坏主意。 在新项目中,应该将它设置为实际使用的FreeMarker版本号。 而在老项目中,那么最好也将它设置的高一些,最好检查一下哪些修改是激活状态(可以在 Configuration(Version) 构造方

  • 假设我在Fedora中以的身份登录,我将从Dockerfile构建Docker映像。该映像将包含一个LAMP环境。我有一个Apache虚拟主机(VH)默认文件,如下所示: 作为构建过程的一部分,该文件被复制到图像上的适当位置。 我可以从主机获取登录用户名并动态设置到此VH吗?最后,我希望得到以下结果: 我知道我可以从bash中使用获取当前用户的值,但我如何在Docker构建中将其插入/设置到VH文

  • 当我尝试使用Composer客户端将软件包安装到Contao时,我收到一个错误: 致命错误:第220行的phar://D:/wamp/www/myproject/composer/composer.phar/src/composer/dependencysolver/Solver.php中允许的内存大小为1073741824字节(尝试分配134217728字节) 我真的很困惑。我的PHP内存限制设