Orika 嵌套属性扁平化

Posted

技术标签:

【中文标题】Orika 嵌套属性扁平化【英文标题】:Orika nested properties flattening 【发布时间】:2014-08-12 20:39:03 【问题描述】:

我需要帮助将 n 级深层结构展平为单级对象属性。约定是使用下划线字符 (level1_level2_level3)。我正在使用 orika (http://orika-mapper.github.io/orika-docs/index.html)

例如。

Variable1.Property1.Property2.Property3

其中 Property1 为 Set,Property2 为类,Property3 为 String。

我在 orika 中需要的映射可以使用这个设置来实现:

.field("Property1Property2.Property3", "Property1_Property2_Property3")

问题是我需要可以是 n 级深度的通用解决方案。如果类型是列表/集合,我将只取第一个元素(如果列表/集合不为空)。

这是我想要实现的目标:

Class1 

String property1;
Set<Class2> property2;



Class2 

String property3;
Class3 property4;



Class3 

String property5;    





MapHere 

String property1;
String property2_property3;
String property2_property4_property5;


更新:

如果有人需要,这里是 FlattenClassMapBuilder 的实现:http://pastie.org/9324242

还有,按包映射:

    String aPrefix = "com.something.domain";
    String bPrefix = "com.something.dto";

    //----------------------
    Reflections reflections = new Reflections(aPrefix, new SubTypesScanner(false));
    //uzmi sve klase iz paketa koji je dat u aPrefix putanji (recimo "com.nesto.nesto1")
    Set<Class<?>> aClasses = reflections.getSubTypesOf(Object.class);
    reflections = new Reflections(bPrefix, new SubTypesScanner(false));
    //uzmi sve klase iz paketa koji je dat u bPrefix putanji (recimo "com.nesto.nesto2")
    Set<Class<?>> bClasses = reflections.getSubTypesOf(Object.class);
    for(Class<?> aClass : aClasses)
    
        for(Class<?> bClass : bClasses)
        
            if(aClass.getSimpleName().equals(bClass.getSimpleName()))
            
                //za sve klase iz aPrefix-a cije se ime poklapa sa klasom iz bPrefix-a
                mapperFactory.classMap(aClass, bClass).byDefault().register();
            
        
    
    //------------------------

【问题讨论】:

【参考方案1】:

实际上 Orika 可以处理这个问题,但是您应该通过提供 DefaultFieldMapper 的实现来提供此自动映射策略

在Orika源代码/测试中,有一些例子。

【讨论】:

我尝试了这种方法,但我来到了需要映射 List 属性的步骤(在我的情况下为 Property1),但实际上我需要的是 Property1.Property2.Property3 - 这是嵌套的这个属性。 或者您甚至可以使用提供您自己的 ClassMapBuilder/Factory,覆盖 byDefault 方法来实施您的策略。例如,当您面对 ListPropertX 时,您可以通过 id 注册转换器。每年使用转换器(对于 ListPropertyX)做一些案例,一旦你清楚算法,你就可以自动化它(DefaultFieldMapper / 自定义 ClassMapBuilder)。 Orika 提供了很多扩展点,这取决于每种情况/需要选择哪一个。 你有这方面的样品吗?这是我想要实现的映射:(编辑过的原始问题) 这是一个尝试进行不区分大小写映射的示例gist.github.com/elaatifi/7009879 我下载了代码,但是遇到嵌套属性你知道怎么继续映射吗?

以上是关于Orika 嵌套属性扁平化的主要内容,如果未能解决你的问题,请参考以下文章

Extjs - 在属性网格中显示嵌套对象

嵌套的json扁平化火花数据框

你知道如何将python中嵌套的列表扁平化吗?

扁平化 SVG 嵌套转换的工具 [关闭]

扁平化嵌套列表迭代器

341. 扁平化嵌套列表迭代器