jackson 遍历列表并获取其状态被标记的人员的ID

67up9zun  于 2023-01-02  发布在  其他
关注(0)|答案(2)|浏览(99)

我想在这个json中循环,并在状态被标记的地方停止,同时获取id的值。这是我目前所做的。有人能帮我弄清楚如何做到这一点吗?通过这个方法,我能够停止循环,并在状态被"标记"的地方返回true,但问题是我还想从状态被"标记"的地方返回id的值。

    • 儿子:**
{
"message": "Multiple_number",
"listOfId": [
{
    "Id": "7895953453",
    "aliasName": "",
    "status": "Active"
},
{
    "Id": "9045451400",
    "aliasName": "",
    "status": "tagged"
},
{
    "Id": "8923688789",
    "aliasName": "",
    "status": "Pending"
}
],
  "status": "FAILURE"
}
    • 代码:**
HashMap<String, Object> json = parser.object();
if (json.containsKey("listOfId")) {
    ObjectMapper objectMapper = new ObjectMapper();
    StatusResponseCO mobileDcResponseDto = 
    objectMapper.readValue(responseEntity, StatusResponseCO.class);
    List<StatusResponseSubCO> statusResponseCOS = mobileDcResponseDto.getListOfId();
    Map<String, Long> counting = statusResponseCOS.stream().collect(
        Collectors.groupingBy(StatusResponseSubCO::getStatus, Collectors.counting()));
    System.out.println(counting);
    for (Map.Entry<String, Long> entry : counting.entrySet()) {
        String status = entry.getKey();
        if ("Tagged".equals(status)) {
            return true;
        }
    }
    • 状态响应CO. java**
public class StatusResponseCO {
    private List<StatusResponseSubCO> listOfId;
}
    • 状态响应子公司. java**
public class StatusResponseSubCO {
    private String Id;
    private String status;
}
svmlkihl

svmlkihl1#

所以我创建了一个runnable example for you(也包含了完整的源代码),其要点就是将反序列化后的列表传递给这个方法:

public static List<StatusResponseSubCO> findTagged(List<StatusResponseSubCO> list){
    return list.stream().filter(sub -> 
        sub.status.equals("tagged"))
            .collect(Collectors.toUnmodifiableList());
}

循环遍历列表(也可以用一个老的for循环来完成),过滤掉所有不匹配 predicate 的内容,然后收集结果并将其转换为列表;
如果您100%确定原始列表中只能有一个匹配项,那么您当然可以向结果列表中添加一个.get(0)以获得单个StatusResponseSubCO示例,并通过该示例获得id
当然,您可以做很多改进:

  • 避免直接比较字符串,并直接反序列化为枚举
  • 使用更现代的Java(我们使用的是Java 19!)--如果需要,您总是可以编译到更早的目标运行时
  • 使用record类型(Java 14)
  • 使用Streams.toList()进行一些简化(Java 16)
hgc7kmma

hgc7kmma2#

你的代码假设有一条记录是“标记的”,所以我也做同样的假设。你已经把JSON转换成了数据类型,并且当你调用这个函数时,你已经有了记录列表。

List<StatusResponseSubCO> statusResponseCOS = mobileDcResponseDto.getListOfId();

因此,您应该能够迭代此List,找到状态为“tagged”的记录并返回该记录的ID。以下示例假定找不到匹配记录是一种不良状态,并引发某种异常。如果合理,您可以返回null。
使用流API。

Optional<String> id = statusResponseCOS.stream()
    .findAny(r -> "Tagged".equals(r.getStatus()))
    .map(r -> r.getId());
if (id.isPresent()) { 
  return id.get();
}
throw SomeBadStateOrWhateverException("No sub record is Tagged");

您还可以使用常规for循环

for (StatusResponseSubCO r: statusResponseCOS) {
  if ("Tagged".equals(r.getStatus()) {
    return r.getId();
  }
}
throw SomeBadStateOrWhateverException("No sub record is Tagged");

相关问题