这是我的 API 响应,这里的响应是作为 Map 对象而不是 Json 来的。

 {
  "staticResponses": [
    {
      "code": {
        "id": "someId",
        "value": "44343567"
      },
      "staticAttributes": [
        {
          "id": "SEC_GUAR",
          "value": "someValue4"
        },
        {
          "id": "FIN_BOND_TYPE",
          "value": ""
        },
        {
          "id": "SEC_ISSER_ID",
          "value": "someValue5"
        },
        {
          "id": "SEC_ISSE_CRNCY",
          "value": "someValue6"
        }
        //Here more objects with id and value(same as above) which needs to be mapped to corresponding fields of RatingModel Pojo.   
      ]
    }
  ]
}

对等效 Pojo 字段映射的 API 响应

Keys Comming In API Response        Corresponding Field Name in Model            
SEC_GUAR                            guarantor
FIN_BOND_TYPE                       covered
SEC_ISSER_ID                        issuerId
SEC_ISSE_CRNCY                      securityCurrency

我需要将数据映射到的 Pojo

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class RatingCompositionModel implements CompositionModel {
   private List<RatingModel> ratings;
}

评级模型.java

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class RatingModel implements CompositionModel, Serializable {

    private static final long serialVersionUID = -8447345872052120852L;

    private String securityCurrency;
    private String covered;
    private String guarantor;
    private String issuerId;
    //here renaming fields 
}

我为实现相同目的而编写的代码

private CompositionModel mapResponseToObject(LinkedHashMap responseBody) {
        RatingCompositionModel ratingCompositionModel = new RatingCompositionModel();
        List<RatingModel> ratingModelList = new ArrayList<>();
        List<LinkedHashMap> responseObjectList = (List<LinkedHashMap>) responseBody.get("staticResponses");
        if( null != responseObjectList && !responseObjectList.isEmpty() ) {
            responseObjectList.forEach(responseObject -> {
                List<LinkedHashMap> staticAttributes = (List<LinkedHashMap>)responseObject.get("staticAttributes");
                if( null != staticAttributes && !staticAttributes.isEmpty()) {
                    RatingModel ratingModel = new RatingModel();
                    staticAttributes.forEach(staticAttribute -> {
                        if( ((String)staticAttribute.get("id")).equals("SEC_GUAR") ) {
                            ratingModel.setSecurityCurrency((String)staticAttribute.get("value"));
                        }
                        // more else if here...
                    });
                    ratingModelList.add(ratingModel);
                }
            });
        }
        ratingCompositionModel.setRatings(ratingModelList);
        return ratingCompositionModel;
 }

所以这里的问题是我必须使用的 if-else 块的数量,目前我有大约 50 个字段我需要从 API 响应中提取并需要映射到我的 POJO 中的相应字段,所以我的方法我有使用 50 个 if-else 条件,将来,如果我的 POJO 有任何变化,比如添加更多字段(很有可能),我必须添加更多 if-else 块。 另外值得注意的是,我无法更改 API 响应中字段的名称以将其与我的 POJO 匹配,因为这是一些不受我控制的第三方 API。

在这里寻找更动态的解决方案来避免 if-else 阻塞以及有效地处理任何未来的变化。

#1楼 票数:1

您不需要 if-else 条件,只需遍历staticAttributes并将它们存储在Map ,完成后,您可以使用ObjectMapperconvertValue api 直接将此Map对象映射到您的 POJO 类。

FinalPojo readValue = objectMapper.convertValue(collect, FinalPojo.class);

但是您需要告诉 Jackson 映射中的哪个键要映射到 POJO 中的哪个字段。 您可以@JsonProperty使用@JsonProperty注释。

下面是示例 POJO 类

import com.fasterxml.jackson.annotation.JsonProperty;

public class FinalPojo {

  @JsonProperty("SEC_GUAR")
  private String guarantor;

  @JsonProperty("FIN_BOND_TYPE")
  private String covered;

  @JsonProperty("SEC_ISSER_ID")
  private String issuerId;

  @JsonProperty("SEC_ISSE_CRNCY")
  private String securityCurrency;
}

#2楼 票数:0

您可以使用 Gson 库提供的 @SerializedName 注释简单地注释类的字段。 你可以在下面找到一个例子。 使用这个librart 来转换json 真的很方便。

https://www.tutorialspoint.com/what-to-use-serializedname-annotation-using-gson-in-java

  ask by MOnkey translate from so

未解决问题?本站智能推荐:

1回复

使用Java8Stream将复杂数据映射到对象

我有一个文本文件,其中包含一组记录,如下所示: 我想创建一个列表对象。 每个家长都应将所有子对象作为一个列表。
1回复

java中多级映射到Json结构

我正在尝试将多级地图转换为 Json,其中地图的级别可以是任何级别。 例如我有地图 我想将其转换为 类似于保持顺序的正确 json 以及值 6 和 8 属于测试的第一个索引,因此它们应该首先出现,第二个数组应该在测试数组中包含 9 和 12。 由于此 json 稍后将用于根据索引检索确切值。 如果有
2回复

Java8Streams-使用流将相同类型的多个对象映射到列表

是否有可能以更好的方式使用流来执行下面提到的步骤? instanceDistribution.getStudentId()和instanceDistribution.getTeacherId()都是Long类型。 有可能会提出这类问题,但我无法理解。 简单的是或否。 如果是/否,那么
3回复

Java8Lambdas:将Stream映射到Integer类型然后调用sum()将无法编译

我正在玩Java8 lambda表达式。 作为一个例子,我然后尝试总结列表中包含的年龄: 当我尝试使用以下java编译器编译此代码段时: 我得到以下编译错误: 但是如果我将getAge()方法的返回值从Integer更改为int,我会得到预期的结果。 但有时候不可能或不希望在飞行
6回复

Java8流映射到按值排序的键列表

我有 map Map<Type, Long> countByType并且我想要一个列表,该列表按相应的值对键进行了排序(最小到最大)。 我的尝试是: 然而,这只是给了我一个条目列表,我怎样才能在不丢失订单的情况下获得类型列表?
2回复

在Java中将一个arraylist映射到另一个arraylist

在arraylist问题上我需要您的帮助。 我有2个arraylist。 好吧,数组b代表a中的食物。 可以说 目前我一点都不知道。 希望你们可以帮助我解决这个问题。 提前致谢
4回复

如何引用Java映射中的类型的对象?

我是一个初学者,被困住了。 我有一个类型为String,Object的Map。 一旦我宣布: 现在我该怎么做。 我如何将我的价值观转化为鱼对象-我对如何引用鱼对象感到困惑。 我知道我应该使用“ get”,但是我尝试的所有方法都不起作用。 抱歉,我知道这是简单的事情,但我们将不胜感
2回复

以通用类型作为键/值的Java通用映射

我想编写一个以 Map 作为参数的方法,该方法可以包含任何对象作为其值。 我正在尝试使用泛型来实现它,但我无法实现它。 以下是我迄今为止尝试过的代码。 这段代码作为两种方法: genericTest ,我试图实现一个通用解决方案,以及nonGenericTest ,这是我真正想要用通用解决方案做的,