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

如何将下面的嵌套对象展平为字符串数组?

阎啸
2023-03-14

我正在尝试将下面的对象转换为字符串数组

JSON对象

输入:

  [
    {
        "name": "Pantry",
        "childrenItems": [
          {
            "name": "Butter",
            "childrenItems": [
              {
                "name": "Cream",
                "childrenItems": []
              }
            ]
          },
          {
            "name": "Snack",
            "childrenItems": []
          }
        ]
      },
    
     {
        "name": "Medicine",
        "childrenItems": []
      }
    ]

所需输出:

["Pantry-

我的POJO看起来像这样

@Data
public class CategoryTreeDto {
    private String name;
    private List<CategoryTreeDto> childrenItems;
}

如何使用java 8流API展平嵌套类别的JSON对象

我尝试使用递归和java8flatMap函数来整平和连接字符串,但没有得到预期的输出。

这是基于亲子关系,因为食品储藏室是父母,孩子是黄油,黄油的孩子是奶油,食品储藏室还有一个孩子是零食。


共有2个答案

贾成天
2023-03-14

看起来像简单的dfs算法

public static List<String> dfs(List<CategoryTreeDto> items) {
    return dfs(items, new LinkedList<>(), new ArrayList<>());
}

private static List<String> dfs(List<CategoryTreeDto> items,
                                Deque<String> path,
                                List<String> res) {
    if (items == null || items.isEmpty()) {
        if (!path.isEmpty()) {
            res.add(String.join("->", path));
        }
    } else {
        for (CategoryTreeDto item : items) {
            path.addLast(item.getName());
            dfs(item.getChildren(), path, res);
            path.removeLast();
        }
    }

    return res;
}
安博文
2023-03-14

对于这个特定的任务,我认为递归比java流简单得多。

public class Test {

  public static void main(String[] args) throws IOException {
    List<CategoryTreeDto> list = //get data
    List<String> result = new ArrayList<>();
    for (CategoryTreeDto dto : list) {
      traverse(dto, dto.getName(), result);
    }
    System.out.println(result);
  }

  private static void traverse(CategoryTreeDto dto, String current, List<String> result) {
    List<CategoryTreeDto> children = dto.getChildrenItems();
    if (children.isEmpty()) {
      result.add(current);
      return;
    }
    for (CategoryTreeDto childDto : dto.getChildrenItems()) {
      String next = current + "->" + childDto.getName();
      traverse(childDto, next, result);
    }
  }
}

首先深入,直到没有更多的子级,在此期间构建路径。当没有更多的子级时,将路径添加到结果并返回(这是递归的结束)。

指纹

[Pantry->Butter->Cream, Pantry->Snack, Medicine]

举个例子。

 类似资料:
  • < b >想改进这个问题?通过编辑此帖子更新问题,使其只关注一个问题。 我正在尝试将下面的对象转换为字符串数组 JSON对象 输入: 所需输出: < code>[“餐具室- 我的POJO看起来像这样 如何使用 java 8 流 API 扁平嵌套类别的 JSON 对象。 我尝试使用递归和java 8 flatMap函数来展平和连接字符串,但没有按预期获得输出。 这是基于亲子关系,因为食品储藏室是父母

  • 我正在尝试将来自我的数据库的对象的平面数组转换为需要嵌套结构才能管理可扩展子行的react-table。 我已经制作了一个代码沙盒,它非常简单: https://codesandbox.io/s/tender-chatterjee-kdssi?file=/src/App.js 基本上,我的原始数据结构如下: 我想把它转换成这个结构: 我已经尝试了一些递归的方法,但是他们留下了一些选择,所以我很乐意

  • 我正在尝试使用来部分地反序列化模型,因此其中一个属性被读取为包含原始JSON的字符串。 示例代码 应该生成模型,其中属性将原始JSON中的Info对象作为字符串包含: 它不能开箱即用并抛出异常: System.Text.Json.JsonException:--- 到目前为止我尝试了什么: 并将其应用于模型中 并将选项添加到 尽管如此,它还是抛出了相同的异常: System.Text.Json.J

  • < code>[[{header=C,value=dsd},{header=D,value=test},{header=E,value=e},{header=F,value=hhh},{header=G,value=ghgh}]] 上面是JsonLists数组的数组,我需要将外部数组扁平化为JsonLists的内部数组。 我最终也只会从JsonList中获取值,并将这些值放入它自己的单独数组中:

  • 我听说过Jackson,但我不确定如何使用它来适应我所拥有的json字符串,因为它不仅仅是键值对,因为涉及到“MyMusic”列表。如果杰克逊不是最好的,我怎么能和杰克逊一起完成这件事呢?或者有什么更简单的方法可以让我完成这件事呢?

  • 我有一门java课 在上面的场景中,示例具有子示例,这又是示例列表。此嵌套可以是 n 级。我想实现的是有一个示例列表,即扁平化上面的对象并将所有示例收集到最终列表中(收集所有n级示例)。一个明显的方法是递归。在Java中有什么方法可以更有效地实现它。我尝试了一些java 8概念,但它们不符合要求。