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

自定义映射从JSON到Java /POJOSpring RestTemboard响应

斜昊空
2023-03-14

我有一个Spring Boot应用程序,我使用RestTemboard调用Rest API,我收到以下JSON格式的响应:

{
  "data": [
    {
      "id": "1",
      "type": "type1",
      "config": {
        "property1" : "value1",
        "property2" : "value2"
      }
    },
    {
      "id": "2",
      "type": "type2",
      "config": {
        "property3" : "value3",
        "property4" : "value4",
        "propArray": [ "element1", "element2"]
      }
    }
  ]
}

数组“data”中的单个元素几乎没有不同的结构(上面的两个例子),我想用单个元素映射不同的类类型,这取决于元素“type”的值。

例如,值“type1”应该映射到类类型为“type1”的对象,依此类推。

我创建了如下类:MyResponse:

public Class MyResponse {
  List<Data> data;
..
  \\getter and setters
}

数据:

public Interface Data {}

类型1:

public Class Type1 implements Data {
  private String property1;

  private String property2;
..
  \\getter and setters
}

类型2:

public Class Type1 implements Data {
  private String property3;

  private String property4;

  private List<String> propArray;
..
  \\getter and setters
}

如何映射上述条件结构?

共有1个答案

龚跃
2023-03-14

我能想到的唯一方法是将返回值转换为字符串,将其转换为JSONObject,并对其进行处理以创建类的实例。例如

    String response = restTemplate.<your-uri>
    JSONObject jsonObject = new JSONObject(response);
    if (jsonObject.get(type).equals(type1) {
        Type1 type1 = new Type1();
        // set values
    } else if (jsonObject.get(type).equals(type2) {
        Type2 type2 = new Type2()
        // set values
    }

然而,这是不可伸缩的,如果您要添加越来越多的类型,那么维护干净的代码将是非常困难的。

另一种方法是创建一个通用类,并作为该类的列表接收响应。通过这种方式,Spring boot/jackson可以进行映射。同样,您必须添加代码来从这个常规类创建其他类。正如Sam在评论中指出的,这将是一个首选,因为Jackson比JSONObject更快。下面是一个示例类,

class Response {
    private Integer id;
    private String type;
    private Map<String, Object> config;
}

您仍然需要检查类型并映射到相应的类。

与其编写如此混乱的代码,我会考虑如果你能控制它,我是否可以重新构建你的设计/发送的响应。

 类似资料:
  • 我一直在研究GraphQL作为我的一些RESTAPI的替代品,虽然我认为我已经对基本知识了如指掌,就像我目前看到的大多数内容一样,但似乎缺少了一个重要的功能。 比如说,我有一系列这样的物品: 应用程序需要所有这些对象的映射,按ID索引: 我写过的每个API都能够以这样的格式返回结果,但我正在努力寻找一种用GraphQL来做到这一点的方法。我一直在运行第101个问题,但这更多地涉及未知模式。就我而言

  • 让我们假设我有以下json 如何在java中创建一个自定义类来映射它?我试过这个班的形状 并且形状是 用Jackson地图绘制器绘制地图 正如预期的那样,给我一个错误: 我想要"0008005"作为字段值而不是字段键,这些值是根据API动态变化的,所以如何映射这个json,有没有其他直接的方法最后一个选项op自定义反序列化?

  • 例如,我有以下接口映射器: 在代码中,您可以看到映射和一些默认方法,其中包含其他映射。如何在Mapstruct映射中使用这些方法,以便Mapstruct使用这些方法在字段中填充值?

  • 本文向大家介绍apache-spark 使用Gson将JSON映射到自定义类,包括了apache-spark 使用Gson将JSON映射到自定义类的使用技巧和注意事项,需要的朋友参考一下 示例 使用Gson,您可以读取JSON数据集并将其映射到自定义类MyClass。 由于Gson不可序列化,因此每个执行程序都需要自己的Gson对象。而且,MyClass必须可序列化才能在执行程序之间传递。 请注意

  • 我有一个像这样的json,它嵌套在其中一个字段中- 我创建了一个自定义类, 在我的服务类中,我正在读取json并将其映射到我的EmailTemplate类中,但是映射失败了。这里有什么可以用的? 例外情况: 我试着添加 但这也不起作用。

  • 问题内容: 我有一个带有四列ID,名称,颜色,形状的食用水果。 该表中的条目为: 现在,我将一个实体类Fruit映射到上表。 在我的DAO类中,代码是: 显而易见,在上面的查询中运行将返回3行。 我有一个简单的TO类FruitSearchTO 此TO符合我的查询返回的行。 但是在我的DAO中运行类似: 抛出异常java.lang.ClassCastException:[Ljava.lang.Obj