将 json 反序列化为 pojo,其中 json 字段具有不同的数据类型

2023-11-29

我正在尝试将 json 反序列化为 java pojo,但我无法理解应该如何开始创建一个可用于反序列化 json 的 java 对象,如下所示:

{
    "links": [],
    "version": 2,
    "executionState": "completed",
    "outputs": [
        {
            "name": "identifier",
            "value": "2411"
        },
        {
            "name": "segment",
            "value": "COMPLEX"
        },
        {
            "name": "rules",
            "value": [
                {
                    "metadata": [
                        {
                            "ID": "int"
                        },
                        {
                            "NAME": "string"
                        },
                    ]
                },
                {
                    "data": [
                        [
                            2,
                            "S1"
                        ],
                        [
                            21,
                            "S6"
                        ]
                    ]
                }
            ]
        }
    ]
}

我正在与杰克逊合作并希望使用这样的东西: MyPojo 响应 = mapper.readValue(jsonString, MyPojo.class)

最大的困难是那些“值”元素,其中一些字段包含简单的字符串,而在其他情况下则包含元素数组

我尝试为元素“值”创建一个抽象类,然后再创建两个扩展抽象类的类。但这没有用


最好的方法是创建一个自定义类型解析器:

static class Outputs {
    public String name;
    @JsonDeserialize(using = OutputsDeserializer.class)
    public OutputsValue value;
}

static abstract class OutputsValue {

}

@AllArgsConstructor
static class Outputs1 extends OutputsValue {
    public String value;
}

@AllArgsConstructor
static class Outputs2 extends OutputsValue {
    public List<Outputs2Item> value;
}

static class OutputsDeserializer extends JsonDeserializer<OutputsValue> {

    @Override
    public OutputsValue deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
        ObjectCodec codec = jp.getCodec();
        JsonNode node = codec.readTree(jp);
        if (node.getNodeType().toString().equalsIgnoreCase("STRING"))
            return new Outputs1(codec.treeToValue(node, String.class));
        List<Outputs2Item> xs = new ArrayList<>();
        node.elements().forEachRemaining(e -> {
            try {
                xs.add(codec.treeToValue(e, Outputs2Item.class));
            } catch (JsonProcessingException ex) {
                ex.printStackTrace();
            }
        });
        return new Outputs2(xs);
    }
}

static class Outputs2Item {
    public List<Outputs2ItemMeta> metadata;
    public List<Object /* integer | string */ > data;
}

static class Outputs2ItemMeta {
    public String ID;
    public String NAME;
}

static class Pojo {
    public List<String> links;
    public int version;
    public String executionState;
    public List<Outputs> outputs;
}

运行与

final Pojo o = new ObjectMapper().readValue(new File("/home/josejuan/tmp/z.json"), Pojo.class);

该对象包含所有必需的值

enter image description here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 json 反序列化为 pojo,其中 json 字段具有不同的数据类型 的相关文章

  • 使用 xuggle 将 mp3 转换为 wav 出现异常

    我正在尝试将 mp3 转换为 wav 代码在这里 String mp3 F work pic2talk38512 mp3 String wav F work pic2talk38512 wav TranscodeAudioAndVideo
  • 从 Bitmap 类创建 .bmp 图像文件

    我创建了一个使用套接字的应用程序 客户端在其中接收图像并将图像数据存储在 Bitmap 类中 谁能告诉我如何创建一个名为我的图像 png or 我的图像 bmp来自此 Bitmap 对象 String base64Code dataInpu
  • 警告:跳过条目,因为它不是绝对 URI。 NetBeans 中的 GlassFish

    我成功安装了 GlassFish 但是 当我启动服务器时 我收到两条警告消息 警告 跳过条目 因为它不是绝对 URI 那是关于什么的 Launching GlassFish on Felix platform Aug 09 2014 10
  • 隐藏类的 System.out.print 调用

    我正在使用 java 库 jar 文件 该文件的作者放入了一堆System out print and System out printlns 有没有办法隐藏特定对象的这些消息 编辑 看起来jar文件似乎正在创建一堆线程 并且每个线程都有它
  • 在 Java 中填充布尔数组

    作为一名相当新手的 Java 程序员 我给自己设定了一个艰巨的挑战 尝试编写一个简单的文本冒险 不出所料 我已经遇到了困难 我试图为我的 Location 类提供一个属性来存储它包含的退出 我为此使用了一个布尔数组 本质上保存代表每个出口的
  • 适用于 Solaris 的 Java 8 中缺少 javaws

    看起来 Oracle 从 Java 8 for Solaris 中删除了 Java Web Start javaws 在 Java 8u51 中不再可用 来自兼容性指南 http www oracle com technetwork jav
  • 使用 AFNetworking 2.0 发布 JSON 数据

    我有一个 Web 脚本 它通过 HTTP POST 请求接受 JSON 字符串作为输入 我遇到过几个相同的 AFNetworking 1 x 示例 任何人都可以指出我或提供 AFNetworking 2 0 示例 以对使用格式化 JSON
  • 我需要显式关闭连接吗?

    我持有一个实例MongoClient and DB在我的应用程序中 每次我想执行某些操作时 我都会调用getCollection 我想知道是否需要显式关闭连接 就像connection close 在 JDBC 中 强调一下 我只有一个Mo
  • Ant 无法启动,给出主类错误

    我正在运行 Elementary OS 基于 Ubuntu 12 并且在运行 apache ant 时遇到问题 它在重新启动之前就可以正常工作 所以我不确定会发生什么变化 我在 etc environment 中定义了环境变量 如下所示 P
  • 给定一个单词列表 - 在 java 中完成单词的好的算法是什么?权衡:速度/效率/内存占用

    我正在探索潜在的免费 付费应用程序的硬件 软件要求 最终目标是移动 Java 应用程序 该应用程序将从这个简单的目标开始 给定数据库中相关单词的列表 能够对单个字符串输入进行单词补全 换句话说 我已经知道数据库的内容 但算法的内存占用 速度
  • 在java中是否可以使用反射创建没有无参数构造函数的“空白”类实例?

    我有一个没有默认构造函数的类 我需要一种方法来获取此类的 空白 实例 空白 意味着实例化后所有类字段都应具有默认值 如 null 0 等 我问这个问题是因为我需要能够序列化 反序列化大对象树 而且我无法访问该对象类的源 并且类既没有默认构造
  • 在 Java 中使用 Inflater 解压缩 gzip 数据

    我正在尝试使用以下方法解压缩 gzip 数据Inflater 根据文档 如果参数 nowrap 为 true 则 ZLIB 标头和校验和 字段将不会被使用 这提供了与 GZIP 和 PKZIP 使用的压缩格式 注意 使用 nowrap 选项
  • 使用 Java 通过 HTTP 下载未知长度的文件

    我想用java下载一个HTTP查询 但是我下载的文件在下载时有一个未确定的长度 我认为这将是相当标准的 所以我搜索并找到了它的代码片段 http snipplr com view 33805 http snipplr com view 33
  • Akka 和 spring 配置

    我正在尝试将 akka 与 spring 结合起来 但没有成功 基本上 我的应用程序似乎不习惯读取 akka 模式 具有架构的 service context xml 的一部分
  • 设置 JAVA_HOME 变量时出现问题

    所以我刚刚下载了 Android Studio 并尝试设置 JAVA HOME 变量以便我可以运行它 我使用的是 Windows 8 并按照我找到的所有说明进行操作 但无济于事 转到高级系统设置 gt 环境变量 然后使用包含我的 jre7
  • 使用链接列表插入优先级队列的方法

    首先 我觉得我应该提到这是一项作业 我并不是在寻找直接的代码答案 只是为了指出正确的方向 我们被要求在链表中实现优先级队列 我正在努力编写 insert 函数的第一部分 在代码中我尝试检查是否head包含任何内容 如果没有则设置为head
  • 如何告诉 IntelliJ 使用 Java 1.6 JDK 启动 gradle?

    一个简单的问题 即使经过几个小时的尝试和搜索 我也无法弄清楚 我安装了 Java 6 和 7 如何告诉 IntelliJ 使用 JDK 版本 1 6 启动 Gradle 构建 无论我做什么 IntelliJ 都会以以下方式开始我的 grad
  • Checkstyle - 方法按修饰符排序

    是否可以添加到 checkstyle 规则以按修饰符对类中的方法进行排序 我的意思是开头的公共方法和最后的私有方法 MethodsOrderCheck做这个工作 检查文档 https www qulice com qulice checks
  • Drools:为什么是无状态会话?

    Drools 使用会话来存储运行时数据 为此 有两种会话 无状态和有状态 与无状态会话相比 有状态会话允许迭代调用 并且似乎比无状态会话具有所有优势 那么为什么会有无状态会话呢 他们服务的目的是什么 与有状态会话相比 它们的优势是什么 谢谢
  • Java,如何管理线程读取socket(websocket)?

    我有一个 WebSocket 服务器 我的服务器创建一个新线程来处理新连接 该线程一直处于活动状态 直到 websocket 中断 我的问题 对于 1 000 000 个连接 我需要 1 000 000 个线程 我如何通过一个线程处理多个

随机推荐

  • 如何从 C 方法调用 Objective-C 方法?

    我有一个 Obj C 对象 里面有很多方法 有时一个方法需要调用同一对象内的另一个方法 我似乎不知道如何让 C 方法调用 Obj C 方法 WORKS Obj C 方法调用 Obj C 方法 self objCMethod WORKS Ob
  • c++ 两种数组声明方法之间的区别

    在 C 中声明数组 并为它们分配内存 的可能多种方法中的两种 1 int a 3 2 int b new int 3 我想了解 c 如何以不同的方式对待这两者 A 在这两种情况下 我都可以使用以下语法访问数组 a 1 and b 1 b 当
  • 如何在批处理文件中从txt文件创建数组?

    我有一个包含以下数据的 txt 文件 aaaa 1000 2000 bbb 3000 4000 cccc 5000 ddd 6000 7000 8000 该文件中的行数不固定 我需要数组中每行的第一个标记并打印每个元素 创建数组 setlo
  • ActiveRecord 上的 to_json 时跳过具有 nil 值的属性

    我想知道是否有任何方法可以跳过具有 nil 的属性 ActiveRecord 上 to json 时的值 默认行为是包含 nil 值 有没有一种方法可以让这个值不出现 lars 的答案适用于单个对象 但对于 Active Record 对象
  • 以编程方式将新列添加到 DataGridView

    我有一个绑定到 DataTable 的 DataGridView DataTable 由数据库查询填充 该表包含一个名为 BestBefore 的列 BestBefore 是格式化为字符串的日期 SQLite 没有日期类型 我想以编程方式向
  • 使用以正则表达式作为键的字典进行多个正则表达式替换

    我想使用多个正则表达式对字符串进行多次替换 我还想在一次传递中进行替换 以避免创建字符串的多个实例 假设对于参数 我想进行下面的替换 同时避免多次使用 re sub 无论是显式使用还是循环使用 import re text local fo
  • 带有 jquery.ajax() 的跨域“授权”标头

    我正在尝试发送跨源域并添加自定义 授权 标头 请参阅下面的代码 Error XMLHttpRequest 无法加载 url Access Control Allow Headers 不允许请求标头字段授权 function loadJson
  • 类路径和源路径之间的区别?

    我对类路径和源路径有这种困惑 我参考了这些链接 也是 但我没做对 参考 javac 的类路径和源路径选项之间的差异 sourcepath 与 classpath 关于自动重新编译 我无法发现 javac 的 classpath 和 sour
  • Firefox 扩展开发 - 数据存储 - Firefox 首选项是个好地方吗?

    我开发了一个 Firefox 插件 需要在本地计算机中保存一些用户数据 现在 我使用 Firefox 提供的文件系统功能在用户系统中创建一些文件夹和文件 可移植性是一个问题 我是为 Windows XP 设计的 但是 Vista 的文件夹结
  • 在准备好的 mysqli 语句中多次使用一个参数

    是否可以在准备好的参数中使用一个参数mysqli 多次声明仅绑定一次 像这样的东西 stmt mysqli gt prepare SELECT FROM user WHERE age BETWEEN 1 2 AND 1 2 stmt gt
  • 仅将字典的最新值添加到列表中[重复]

    这个问题在这里已经有答案了 通过 for 循环创建字典列表 我一直在尝试通过 for 循环创建字典列表 代码如下所示 a x y z b 1 2 3 dict1 superlist for i in range 0 len a dict1
  • javaassist 和 cglib 之间的区别

    我学习hibernate 我了解到hibernate已经停止使用cglib并切换到javaassist 我还了解到javaassist和cglib用于代理生成 所以我想知道这两者是如何工作的以及哪一个更好 他们的工作方式有什么区别 Cgli
  • 将 R 变量传递给 sql 语句

    有没有办法将 R 中定义的变量传递给 sqldf 包中的 SQL 语句 我必须运行下面的代码 并将 v 变量作为 v 传递给 sql select 语句 for i in 1 50 v lt i 450 temp lt sqldf sele
  • sys_brk 的对齐要求是什么

    我正在使用 sys brk 系统调用动态分配堆中的内存 我注意到 在获取当前中断位置时 我通常会得到与此类似的值 mov rax 0x0C mov rdi 0x00 syscall 结果是 rax 0x401000 该值通常按 512 字节
  • javascript 找不到图像文件(Rails 4 应用程序)

    我有一个 Ruby on Rails 4 应用程序 在app assets javascripts 我创建了一个文件map js在谷歌地图上绘制一些自定义标记 var marker new google maps Marker dragga
  • 对于不相等的列表,eq 返回 true

    我有一段奇怪的代码需要调试 我认为它应该抛出异常 但它却产生了完全奇怪的结果 将其简化为这两行 EDU gt gt A 0 0 A 0 0 EDU gt gt A 1 2 A 2 1 ans 1 为什么两个不相等的逗号分隔列表的比较是正确的
  • Python - 如何跳过特定的 JSON 元素?

    query pages 7412236 pageid 7412236 ns 0 title Steve Jobs extract p b Steven Paul b b Steve b b Jobs b u02c8d u0292 u0252
  • jQuery 中的 onHide() 类型事件

    有谁知道一个onHide jQuery 中的事件或类似的东西 I tried this bind hide function console log asdasda 但显然这不起作用 Edit 只是为了澄清 它是使用 CSS 隐藏的disp
  • 在同一脚本中启动并调用 Ruby HTTP 服务器

    我想知道如何启动 Ruby Rack 应用程序 例如 Sinatra 并在同一脚本中使用 Net HTTP 或类似方法调用它 当然我可以做类似的事情 require sinatra base require net http t Threa
  • 将 json 反序列化为 pojo,其中 json 字段具有不同的数据类型

    我正在尝试将 json 反序列化为 java pojo 但我无法理解应该如何开始创建一个可用于反序列化 json 的 java 对象 如下所示 links version 2 executionState completed outputs