通过 gson 解析带有混合子对象的 json 并作为列表发送回来

2024-01-07

我面临着与解析 json 相关的问题,其中包含子类的混合数组,我需要将其作为 java 列表提供给客户端。

示例 JSON:

{
  "status": "OK",
  "results": [
    {
      "type": "one",
       "Id": "2170676",
       "count": "456",
       "title": "title",
       "description": "description",
       "oneMemberOne": "11",
       "oneMemberTwo": "12",
    }
    {
      "type": "two",
      "Id": "2170677",
      "count": "123",
      "title": "title",
      "description": "description",
      "twoMemberOne": "21",
      "twoMemberTwo": "22",
    }
  ]
}

我由此创建了一个父类和两个子类:

Num:类型、ID、计数、标题、描述字段

1 扩展 Num:一个成员一,一个成员二

两次扩展数量: 两个成员一,两个成员二

现在我的问题是: 我有一个询问结果的方法。说出来List<Num> getResults()

  • 我像这样正确解析数据:

    List<Num> result = new ArrayList<Num>();
    JsonParser parser = new JsonParser();
    JsonObject jsonObject = parser.parse(lastResponsePayload).getAsJsonObject()
    JsonArray results = jsonObject.get("results").getAsJsonArray();
    for (JsonElement element : results) {
         JsonObject trs = element.getAsJsonObject();
         String type = trs.get("type").getAsString();
    
         if (type.equals("one") {
              One one = new Gson().fromJson(element, One.class);
              result.add(product);
         } else if (type.equals("two") {
              Two two = new Gson().fromJson(element, Two.class);
              result.add(metaproduct);
         }
    return result;
    
  • 现在,在客户端,在获得列表后,我必须执行以下操作:

    List<Num> results = getResults();
    List<One> oness = new ArrayList<One>();
    List<Two> twoss = new ArrayList<Two>();
    for(Num n : results) {
         if(n.type.equals("one")
              oness.add((One) n);
         else
              twoss.add((Two) n);
    

对于这种场景来说,这是一个好的设计吗?

该API的用户每次都必须根据父类的类型字段进行向下转换。因为 webservice 为我提供了混合的子类数组,所以我必须这样做。有没有更好的方法来解决这个问题?

  • 我想到的另一种方法是创建一个Result包含两个成员的类One and Two并提供我的List<Result>代替List<Num>, 但随后用户必须检查成员是否是null或不,然后采取适当的措施。

先感谢您。


我建议你再上一堂类似的课。它可以防止客户端代码再次旋转列表并解析记录。请注意,我尚未运行此代码来对其进行测试。

public class Result {
    private List<One> oness;
    private List<Two> twoss;

    public List<One> getOness() {
        return oness;
    }

    public void setOness(List<One> oness) {
        this.oness = oness;
    }

    public List<Two> getTwoss() {
        return twoss;
    }

    public void setTwoss(List<Two> twoss) {
        this.twoss = twoss;
    }
}

并改变

List<Num> getResults()

To

Result getResults()

如果您修改解析逻辑,用户也不必检查空值。请注意,如果我们没有结果,我们不会返回空列表,而是返回 EmptyList。

Result result = new Result();
    JsonParser parser = new JsonParser();
    JsonObject jsonObject = parser.parse(lastResponsePayload).getAsJsonObject()
    JsonArray results = jsonObject.get("results").getAsJsonArray();

    List<One> oness = null;
    List<Two> twoss = null;

    for (JsonElement element : results) {
         JsonObject trs = element.getAsJsonObject();
         String type = trs.get("type").getAsString();

         if (type.equals("one")) {
             if(oness == null) {
                 oness = new ArrayList<One>();
                 result.setOness(oness);
             }
             One one = new Gson().fromJson(element, One.class);
             oness.add(product);
         } else if (type.equals("two")) {
             if(twoss == null) {
                 twoss = new ArrayList<Two>();
                 result.setTwoss(twoss);
             }
              Two two = new Gson().fromJson(element, Two.class);
              twoss.add(metaproduct);
         }
         if(oness == null) {
             result.setOness(Collections.<One>EMPTY_LIST);
         }
         if(twoss == null) {
             result.setTwoss(Collections.<Two>EMPTY_LIST);
         }

    return result;

希望能帮助到你 :)

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

通过 gson 解析带有混合子对象的 json 并作为列表发送回来 的相关文章

  • 将链接对象转换为流或集合

    我想迭代堆栈跟踪 堆栈跟踪由可抛出对象组成 其 getCause 返回下一个可抛出对象 最后一次调用 getCause 返回 null 示例 a gt b gt null 我尝试使用 Stream iterable 这会导致 NullPoi
  • JTree 节点不会被直观地选择

    不知何故 我无法为我的 JTree 节点启用 选择突出显示 我正在我的项目中使用自定义单元格渲染器 这很可能导致此问题 这是完整的渲染器类代码 protected class ProfessionTreeCellRenderer exten
  • 如何对 IntStream 进行逆序排序

    我正在使用 txt 文件读取数字BufferedReader 我想颠倒该流中元素的顺序 以便在收集它们时 它们将从最高到最低排列 我不想在构建数组后进行排序 因为我不知道其中可能有多少元素 我只需要最高的 N 个元素 in new Buff
  • 方法断点可能会大大减慢调试速度

    每当向方法声明行添加断点 在 Intellij IDEA 或 Android Studio 中 时 都会出现一个弹出窗口 方法断点可能会大大减慢调试速度 为什么会这样戏剧性地减慢调试速度 是我的问题吗 将断点放在函数的第一行有什么不同 Th
  • 如何按单个整数字段对 JSON 进行排序? [复制]

    这个问题在这里已经有答案了 我有以下 JSON title title order 0 order 9 order 2 JSON 包含很多字段 我如何根据字段对它们进行排序order field 我一直在寻找 Nodejs 中内置的东西 但
  • 场景生成器删除 fxml 文件中的导入

    我使用场景构建器 Gluon Scene Builder JavaFX Scene Builder 8 1 1 来创建应用程序的 UI 并使用 Eclipse 开发 JavaFX 现在 每次我在场景生成器中保存某些内容时 它都会从 fxml
  • 使用 Java 在浏览器中下载 CSV 文件

    我正在尝试在 Web 应用程序上添加一个按钮 单击该按钮会下载一个 CSV 文件 该文件很小 大小仅约 4KB 我已经制作了按钮并附加了一个侦听器 文件也准备好了 我现在唯一需要做的就是创建单击按钮时下载 csv 文件的实际事件 假设 fi
  • json、rails、javascript 中的解析错误

    我需要将 ruby 数组放入 javascript 数组中 但出现解析错误 var characters 这就是我将 ruby 嵌入到内联 javascript 中的方式 但它出现了解析错误 我应该如何将此 ruby 数组放入 javasc
  • 使用 java 按电子邮件发送日历邀请

    我正在尝试使用 java 发送每封电子邮件的日历邀请 收件人收到电子邮件 但不会显示接受或拒绝的邀请 而是将该事件自动添加到他的日历中 我正在使用 ical4j jar 构建活动 邀请 private Calendar getInvite
  • 参数动态时如何构建 JPQL 查询?

    我想知道是否有一个好的解决方案来构建基于过滤器的 JPQL 查询 我的查询太 富有表现力 我无法使用 Criteria 就像是 query Select from Ent if parameter null query WHERE fiel
  • 如何在java中使jpeg无损?

    有没有人可以告诉我如何使用编写 jpeg 文件losslessjava中的压缩 我使用下面的代码读取字节来编辑字节 WritableRaster raster image getRaster DataBufferByte buffer Da
  • 为什么 ConcurrentHashMap::putIfAbsent 比 ConcurrentHashMap::computeIfAbsent 更快?

    使用 ConcurrentHashMap 我发现computeIfAbsent 比putIfAbsent 慢两倍 这是简单的测试 import java util ArrayList import java util List import
  • 覆盖 MATLAB 默认静态 javaclasspath 的最佳方法

    MATLAB 配置为在搜索用户可修改的动态路径之前搜索其静态 java 类路径 不幸的是 静态路径包含相当多非常旧的公共库 因此如果您尝试使用新版本 您可能最终会加载错误的实现并出现错误 例如 静态路径包含 google collectio
  • 从 html 页面和 javascript 调用 java webservice

    我正在尝试从 javascript 调用 java 实现的 Web 服务 使用 NetBeans IDE 我读过很多关于 jQuery 和 AJAX 的内容 但我似乎无法掌握它 假设我的 Web 服务 WSDL 位于 http localh
  • OpenJDK 版本控制

    上下文 我想确保我们系统上安装的 Java 不受 CVE 2022 21449 的影响 java version 给出 openjdk version 11 0 7 2020 04 14 LTS OpenJDK Runtime Enviro
  • 将 RSA 密钥从 BigIntegers 转换为SubjectPublicKeyInfo 形式

    WARNING 最初的问题是关于 PKCS 1 编码密钥 而问题中的实际示例需要SubjectPublicKeyInfo X 509 编码密钥 我目前正致力于在 java 中从头开始实现 RSA 算法 特别是密钥生成方面 现在我的代码可以给
  • ExceptionHandler 不适用于 Throwable

    我们的应用程序是基于 Spring MVC 的 REST 应用程序 我正在尝试使用 ExceptionHandler 注释来处理所有错误和异常 I have ExceptionHandler Throwable class public R
  • Java 编码风格、局部变量与重复方法调用

    我更喜欢使用局部变量而不是多次调用同一方法 I prefer this Vehicle vehicle person getVehicle if vehicle instanceof Car Car car Car vehicle car
  • Java中有类似分支/跳转表的东西吗?

    Java有类似分支表或跳转表的东西吗 分支表或跳转表是 根据维基百科 http en wikipedia org wiki Branch table 用于描述使用分支指令表将程序控制 分支 转移到程序的另一部分 或可能已动态加载的不同程序
  • 尝试使用带有有效购买令牌的 Java Google Play Developer API v3 检索应用内购买信息时出现错误请求(无效值)

    当使用 Java Google Play Developer API 版本 3 并请求有效购买令牌的购买信息时 我收到以下异常 API 调用返回 400 Bad Request 响应以及以下消息 code 400 errors domain

随机推荐

  • NASM x86 16 位寻址模式[重复]

    这个问题在这里已经有答案了 我在指向地址并在我的情况下写入字节大小的变量时遇到问题 这给了我错误 错误 无效的有效地址 mov byte AX byte 0x0 经过一番尝试和错误后 我测试了相同的结果 但使用的是 EAX 这编译得很好 m
  • Phonegap Facebook 连接插件设置

    我正在使用phonegap插件连接到facebook 这个 https github com phonegap build FacebookConnect https github com phonegap build FacebookCo
  • Vitamio 示例错误 - java.lang.UnsatisfiedLinkError:无法加载 vinit findLibrary 返回 null

    我在运行 vitamio sample 时遇到问题https github com yixia VitamioBundle https github com yixia VitamioBundle 我正在使用 Android Studio
  • 单一来源文档工具[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 What OSS http en wikipedia org wiki Open source sof
  • 从向量中提取连续序列

    我有一个名为 v 的向量 其中包含正值 负值以及零 问题是 如何提取 在列表中 所有连续的正数序列 即用零分隔的正数序列 这是v v lt c 75 09619 38 31229 0 57 17792 65 55923 108 52735
  • 如何在 Keycloak 身份验证之前调用 javax.servlet.Filter

    我们使用resteasy开发了一个REST API 部署在 Wildfly 10 中 基本上 这些 REST API 是从另一个应用程序内部调用的 并且端点使用 keycloak 进行保护 但一个端点暴露给外部各方 该端点也使用 keycl
  • 如何以编程方式将多个源添加到 HTML5 音频标记?

    许多示例演示了嵌套在音频标签中的多个源标签 作为克服不同浏览器之间编解码器兼容性的方法 像这样的东西
  • eclipse:“重新索引存储库工作区”或“计算存储库工作区的 Git 状态”

    我正在使用 eclipse Juno 昨天我注意到我的计算机变得非常热 我检查了CPU使用率 发现它是100 Eclipse 是罪魁祸首 忙着 重新索引存储库工作区 半小时后还没完成 我的机器快要融化了 我搜索并发现了这些类似的问题 重新索
  • 如何检索 Hdfs 文件中的复制因子信息?

    我已为文件设置复制因子 如下所示 hadoop fs D dfs replication 5 copyFromLocal file txt user xxxx When a NameNode重新启动 它确保复制不足的块被复制 因此 文件的复
  • select2 ajax不会显示返回的json数据

    这是从我的 Coldfusion 页面返回的 json 字符串的样子 client Asante id 12 client City of Lancaster id 14 client Massey Energy id 35 client
  • 用六边形填充圆

    我正在尝试找到一种方法 将尽可能多的六边形放在一个圆圈中 到目前为止 我获得的最好结果是从中心向外生成圆形的六边形 但我认为我的计算得到最大六边形圆是错误的 尤其是我使用的部分Math ceil and Math Floor向下 向上舍入某
  • 我应该使用 JSPX 而不是 JSP 吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 Using 开发者 http www oracle com technology products jdev 我开始为工作中的一个项目开发一组网
  • 在 php 中生成唯一的 id(用于 url 缩短器)

    如何使用 0 9 a z 和 A Z 在 php 中生成最多 6 个字符的唯一组合 这些可能有多少种组合 例如 Aaaa 将与 Aaaa 不同 Using base convert number 10 36 不会治疗a z不同于A Z正如问
  • 如何在1.9.2上安装SystemTimer?

    我刚刚使用 RVM 将我的应用程序从 1 8 7 升级到 1 9 2 并且必须添加 RubyGems 和 Bundler 运行捆绑安装并让除 SystemTimer 之外的所有内容正常工作 Google fu 没有返回任何内容 我看到其他人
  • JS 不可枚举函数

    我正在尝试定义一个不可枚举的toJSON在原型对象上运行函数没有太多运气 我希望有类似于 ECMAScript 5 的东西toJSON Object defineProperty obj prop enumerable false 然而 这
  • matlab获取图像上的鼠标坐标而无需单击(鼠标悬停时)

    我已经在谷歌上搜索了一段时间 以找到这个看似简单问题的解决方案 在鼠标移动 无需单击 时获取图像轴中的鼠标坐标 我发现impixelinfoval正是这样做的 但我无法从中提取像素坐标uicontrol在脚本中 它们存储在某个字段中吗 我还
  • 需要加快我的 SVG 速度。我可以转换为 WebGL 或画布吗?

    我有一张包含 10138 个零件的 SVG 绘图 因此运行速度很慢 我想让它运行得更像http workshop chromeexperiments com globe http workshop chromeexperiments com
  • 如何使元素的高度与浏览器分辨率相同?

    我正在尝试使用 jquery 将元素的高度设置为等于用户浏览器 这是我到目前为止得到的代码 但不起作用 是因为我在CSS中设置了最小高度吗 我确实需要该类来等于用户的分辨率 将变量设置为window innerHeight document
  • 与 nl2br 相反?是str_replace吗?

    所以函数 nl2br 很方便 除了在我的网络应用程序中 我想做相反的事情 将换行符解释为新行 因为它们将被回显到预填充的表单中 str replace 可以采取 br 并将其替换为我想要的任何内容 但如果我输入 n 它实际上会回显反斜杠和
  • 通过 gson 解析带有混合子对象的 json 并作为列表发送回来

    我面临着与解析 json 相关的问题 其中包含子类的混合数组 我需要将其作为 java 列表提供给客户端 示例 JSON status OK results type one Id 2170676 count 456 title title