Jackson自定义反序列化器破坏了其他字段的反序列化

2024-03-31

我需要将 JsonArray 反序列化为布尔值。如果数组存在且不为空,则该值应设置为“true”。 问题是,我的自定义反序列化器虽然功能正常,但会破坏其余字段的反序列化 - 它们被设置为空。

Object:

private static class TestObject {
    private String name;

    @JsonProperty("arr")
    @JsonDeserialize(using = Deserializer.class)
    private Boolean exists = null;

    private Integer logins;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Boolean getExists() {
        return exists;
    }

    public void setExists(boolean exists) {
        this.exists = exists;
    }

    public Integer getLogins() {
        return logins;
    }

    public void setLogins(Integer logins) {
        this.logins = logins;
    }

    @Override
    public String toString() {
        return "TestObject{" +
                "name='" + name + '\'' +
                ", exists=" + exists +
                ", logins=" + logins +
                '}';
    }
}

解串器:

public class Deserializer extends JsonDeserializer<Boolean> {
    @Override
    public Boolean deserialize(JsonParser jp, DeserializationContext ctxt)
        throws IOException {
        if (jp.getCurrentToken() == JsonToken.START_ARRAY) {
            return true;
        }
        return false;
    }
}

Test

@Test
public void test() throws JsonParseException, IOException {
    Boolean result = deserialize();
}

private Boolean deserialize() throws IOException, JsonParseException,
        JsonProcessingException {
    TestObject testObject = mapper.readValue("{\n" +
                    "  \"arr\": [\n" +
                    "     {\"value\": \"New\"}\n" +
                    "  ],\n" +
                    "  \"name\": \"name\",\n" +
                    "  \"logins\": 36" +
                    "}",
                    TestObject.class);

    System.out.println(testObject.toString());

    return testObject.getExists();
}

如果我删除“arr”数组或将其移动到 Json 的底部,一切都很好。如果我把它留在顶部 -TestObject{name='null', exists=true, logins=null}.

有一个类似的问题(Jackson 自定义解串器破坏了默认解串器 https://stackoverflow.com/questions/35525471/jackson-custom-deserializer-breaks-default-ones),但不幸的是它的答案为零。 由于当我重新排列 Json 时代码可以正常工作,因此看起来自定义反序列化器并未用于所有字段,而是 Jackson 在执行自定义反序列化器时停止了反序列化。


您的反序列化器可能对数组的内容不感兴趣,但仍必须在解析器上推进读取标记。

你可以读到的值arr立即并根据集合的大小决定:

@Override
public Boolean deserialize(JsonParser jp, DeserializationContext ctxt)
        throws IOException {
    JsonNode node = jp.getCodec().readTree(jp);
    return node.size() != 0;
}

决定size的集合而不是存在集合的存在是必要的,因为您的字符串化对象包含 arr 或Deserializer.deserialize()永远不会被执行。该物业existnull在这种情况下。所以唯一可能表达的语义不存在是一个空集合。

出于好奇,我尝试了第二种更明确的方法来使解析器保持在正轨上。对于现实世界的使用,上述版本绝对是更好的选择。

@Override
public Boolean deserialize(JsonParser jp, DeserializationContext ctxt)
        throws IOException {
    if (jp.currentToken() == JsonToken.START_ARRAY) {
        jp.nextToken();
        int recursionLevel = 1;
        while(recursionLevel > 0) {
            switch (jp.currentToken()) {
                case START_ARRAY:
                    // just in case of nested arrays
                    recursionLevel++;
                    break;
                case END_ARRAY:
                    recursionLevel--;
                    break;
            }
            jp.nextToken();
        }
        return true;
    }
    return false;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jackson自定义反序列化器破坏了其他字段的反序列化 的相关文章

  • 使用cameltestsupport进行Camel单元测试,模板始终为空

    我正在用 Camel 做一个简单的单元测试 我想做的就是从文件 在资源下 读取 JSON 内容 将其发送到 Java 类进行验证 这是我试图测试的路线 无论我做什么 模板 我用来发送正文 json 始终为空 这是我的代码 public cl
  • 如果在睡眠线程上调用interrupt()会发生什么?

    我有一个线程 然后run I call sleep 如果我中断这个线程会发生什么 MyThread extends Thread public void run try sleep 1000000 catch InterruptedExce
  • Grails 2.3.0 自动重新加载不起作用

    我最近将我们的项目升级到 grails 2 3 0 一切工作正常 除了每当我更改代码时自动重新加载都无法工作的问题 这包括所有项目工件 控制器 域 服务 gsps css 和 javascript 文件 我的旧版本 grails 可以正常工
  • 无法使用maven编译java项目

    我正在尝试在 java 16 0 1 上使用 maven 构建 IntelliJ 项目 但它无法编译我的项目 尽管 IntelliJ 能够成功完成 在此之前 我使用maven编译了一个java 15项目 但我决定将所有内容更新到16 0 1
  • Condition 接口中的 signalAll 与对象中的 notificationAll

    1 昨天我才问过这个问题条件与等待通知机制 https stackoverflow com questions 10395571 condition vs wait notify mechanism 2 我想编辑相同的内容并在我的问题中添加
  • 在 HTTP 标头中发送 UTF-8 值会导致 Mojibake

    我想使用 servlet 发送阿拉伯语数据HTTPServletResponse给客户 我正在尝试这个 response setCharacterEncoding UTF 8 response setHeader Info arabicWo
  • 无法在 Spring Boot 测试中模拟 persistenceContext

    我正在使用带有 Mockito 框架的 spring boot 测试来测试我的应用程序 存储库类 EntityManager 之一作为参考 我的班级如下所示 Repository Transactional Slf4j public cla
  • 主线程如何在该线程之前运行?

    我有以下代码 public class Derived implements Runnable private int num public synchronized void setA int num try Thread sleep 1
  • 记录骆驼路线

    我的项目中有几个 Camel 上下文 如果可能的话 我想以逆向工程方式记录路线 因为我们希望保持与上下文相关的文档最新 最好的方法是什么 我们倾向于预先实际设计路线 并使用来自EIP book http www eaipatterns co
  • Java 服务器-客户端 readLine() 方法

    我有一个客户端类和一个服务器类 如果客户端向服务器发送消息 服务器会将响应发送回客户端 然后客户端将打印它收到的所有消息 例如 如果客户端向服务器发送 A 则服务器将向客户端发送响应 1111 所以我在客户端类中使用 readLine 从服
  • RSA OAEP、Golang 加密、Java 解密 -BadPaddingException:解密错误

    我正在尝试解密使用 RSA OAEP 在 Golang 中加密的字符串 但出现 BadPaddingException 解密错误 很难弄清楚我错过了什么 这是Golang加密方法 func encryptString rootPEM io
  • jq中如何分组?

    这是 json 文档 name bucket1 clusterName cluster1 name bucket2 clusterName cluster1 name bucket3 clusterName cluster2 name bu
  • 无法加载或查找主类,可以在命令行中使用,但不能在 IDE 中使用[重复]

    这个问题在这里已经有答案了 在将其标记为重复之前 请先听我说完 我正在尝试使用 gradle 导入一个 java 项目 功能齐全 适用于所有其他笔记本电脑 没有问题 我的项目 100 正常运行 适用于所有其他笔记本电脑 当我的笔记本电脑被重
  • 为什么要序列化对象需要 Serialized 属性

    根据我的理解 SerializedAttribute 不提供编译时检查 因为它都是在运行时完成的 如果是这样 那么为什么需要将类标记为可序列化呢 难道序列化器不能尝试序列化一个对象然后失败吗 这不就是它现在所做的吗 当某些东西被标记时 它会
  • Spring Security OAuth2简单配置

    我有一个简单的项目 需要以下简单的配置 我有一个 密码 grant type 这意味着我可以提交用户名 密码 用户在登录表单中输入 并在成功时获得 access token 有了该 access token 我就可以请求 API 并获取用户
  • 在 Spring Boot Actuator 健康检查 API 中启用日志记录

    我正在使用 Spring boot Actuator APIproject https imobilenumbertracker com 拥有一个健康检查端点 并通过以下方式启用它 management endpoints web base
  • 解析输入,除了 System.in.read() 之外不使用任何东西

    我很难找到具体的细节System in read 有效 也许有人可以帮助我 似乎扫描仪会更好 但我不允许使用它 我被分配了一个任务 我应该以 Boolean Operator Boolean 的形式读取控制台用户输入 例如T F 或 T T
  • 无法捕获 Spring Batch 的 ItemWriter 中的异常

    我正在编写一个 Spring Batch 流程来将数据集从一个系统迁移到另一个系统 在这种情况下 这就像使用RowMapper实现在传递给查询之前从查询构建对象ItemWriter The ItemWriter称为save我的 DAO 上的
  • 对象锁定私有类成员 - 最佳实践? (爪哇)

    I asked 类似的问题 https stackoverflow com questions 10548066 multiple object locks in java前几天 但对回复不满意 主要是因为我提供的代码存在一些人们关注的问题
  • JSON 到 hashmap (杰克逊)

    我想将 JSON 转换为 HashMapJackson http jackson codehaus org 这是我的 JSON String json Opleidingen name Bijz trajecten zorg en welz

随机推荐

  • 用Java模拟触摸命令

    我想更改二进制文件的修改时间戳 这样做的最佳方法是什么 打开和关闭文件是一个不错的选择吗 我需要一个解决方案 其中时间戳的修改将在每个平台和 JVM 上更改 文件类有一个设置最后修改时间 http docs oracle com javas
  • 从哪里获取“sys/socket.h”头文件/源文件?

    我一直在尝试用 C Unix 风格编写服务器 但我被困在 Windows 机器上 我从 MinGW 开始 但它编译不正确 并告诉我它找不到 sys socket h 文件 当然 这是服务器正常工作所必需的 我去寻找它 我想某个地方说要安装
  • PHP 在单位数字之前预先添加前导零,动态 [重复]

    这个问题在这里已经有答案了 PHP 是否有一种快速 即时的方法来测试单个字符串 然后在前面添加前导零 Example year 11 month 4 stamp year add single zero if needed month Im
  • JQuery:更改 URL 参数而不重新加载?

    我有一个问题 在以下条件下是否可以通过 JQuery 更改 URL 相同的 URL 将在浏览器返回和重新加载时加载 更改参数时页面不会重新加载 如果你想阻止页面重新加载 你必须使用哈希 如果你想更改 URL 请尝试 jQuery param
  • 在 Intellij 中找不到日志记录路径

    我想设置我的日志记录路径 以便我可以看到跟踪文件中当前我正在这样做的跟踪 日志记录路径 c temp tracefile log 但我没有看到任何跟踪文件 那么任何人都可以建议这有什么问题吗 或者有没有其他方法可以获取痕迹 请建议 在您的中
  • 如何解决 prestashop 1.5 中从无 cookie 域提供静态内容的问题?

    我在 gtmetrix com 上测试我的网站 它向我显示以下错误 以改进我的网站 yslow scrore 提供来自无 cookie 域的静态内容 如何解决这个错误 您应该创建一些子域 例如 media1 example com medi
  • oh-my-zsh 不应用主题

    我刚刚设置zsh和 一起oh my zsh 但有一些我无法理解的奇怪行为 如果我重新启动终端 或 iTerm 2 两者的行为相同 则指定的主题 zshrc未加载 我需要去做source zshrc让它发生 如果我echo ZSH THEME
  • 如何使用 Struts2 禁用后退按钮

    我在用struts serve static true and struts serve static browserCache false 但后退按钮即使在注销后也能工作 当我单击后退按钮时 它将转到上一个屏幕 我该如何解决这个问题 S2
  • 如何使用 Perl 对 Gmail 进行身份验证?

    我已经安装了this http search cpan org mincus Mail Webmail Gmail 1 09 lib Mail Webmail Gmail pm模块来获取 Gmail 收件箱内的访问和控制 但是 当我尝试通过
  • Git:也移动历史记录中的文件

    是否可以使用 Git 工具将文件移动到新文件夹中 同时修改其完整历史记录 就好像文件从第一次添加时就一直存在在那里一样 我在将一些存储库合并在一起后想到了这一点 我将文件从多个存储库移动到一个 超级 存储库内的不同文件夹 但是合并的历史记录
  • Postman 中 GET 请求中的数组作为参数

    我必须在 GET 请求中发送 ids 数组作为参数 如何在 Postman 中测试它 用于 API 测试的 google chrome 扩展 场景是我有网址 www something com activity poi ids poi id
  • 多处理中出现类似错误。函数参数数量不匹配

    我找不到更好的方法来描述我面临的错误 但每次我尝试对循环调用实现多重处理时 似乎都会出现此错误 我使用了 sklearn externals joblib 和 multiprocessing Process 但错误相似但不同 想要应用多重处
  • 使用 threading.Lock 作为上下文管理器

    在文档中线程 https docs python org library threading html using locks conditions and semaphores in the with statement模块它说 该模块提
  • 在 Heroku 应用程序上安装 spacy en_core_web_lg 时出错

    我正在使用 Django 在 Heroku 上部署我的 ML 模型 我需要en core web lg对于我的应用程序 但无法安装它 我的requirements txt是这样的 djangorestframework 3 12 2 en
  • 如何在 DirectionsRenderer 上获取拖动点

    我使用谷歌地图来绘制我的路线 我只设置了 2 个点 开始和结束 问题是我必须将路线发送到下一页 我知道我可以捕捉事件 google maps event addListener directionsDisplay directions ch
  • Bootstrap 导航栏和内容填充高度弹性框

    我必须创建一个布局 其中内容网格必须位于完整的剩余页面上 但该布局还有一个导航栏 为了做到这一点 我决定将导航栏放在 Flex 容器中 并将内容放在高度为 100 的行中 我需要内容来填充剩余的空间 菜单是动态的 所以我不知道导航栏的高度是
  • vim 将字符替换为 \n

    我需要全部更换 到 n 但是 s n gc不行 See http vim wikia com wiki Search and replace http vim wikia com wiki Search and replace 搜索时 n是
  • 无法在 Mac OS Big Sur 上运行 git

    无法在运行 Big Sur 的新 MacBook 上运行 git 当我尝试运行 git 时 收到以下错误 xcrun 错误 无法加载 libxcrun dlopen Library Developer CommandLineTools us
  • 如何在 ASP.NET MVC 中创建可重用控件

    我应该如何 应该在 ASP NET MVC 3 中创建一些 自定义控件 我对部分观点感到愤怒 ViewUsersControl Html RenderAction 但我仍然不知道哪种方式是剃刀视图正确的 MVC 方式 如果我需要渲染一些aj
  • Jackson自定义反序列化器破坏了其他字段的反序列化

    我需要将 JsonArray 反序列化为布尔值 如果数组存在且不为空 则该值应设置为 true 问题是 我的自定义反序列化器虽然功能正常 但会破坏其余字段的反序列化 它们被设置为空 Object private static class T