【问题标题】:How to convert list of maps to list of objects if list of maps has extra keys如果地图列表有额外的键,如何将地图列表转换为对象列表
【发布时间】:2016-11-05 21:45:01
【问题描述】:

我的问题和How to convert list of maps to list of objects差不多。

但问题是现在,我有listmaps 其中maps 包含一些额外的键,这些键在我的Pojo 类中不存在,如下所示:-

List list = [
    [param1: "a", param2: ["a","b","c"], param3:[a:"a",b:"b",c:"c"], param4:true, param5:1, param6: "pamra6",param7: "pamra7"],
    [param1: "b", param2: ["d","e","f"], param3:[d:"d",e:"e",f:"f"], param4:false, param5:2, param6: "pamra6",param7: "pamra7"]
]

在这个list 中,两个额外的键param6param7 包括在Pojo 类中不存在的地方,因为在我的场景中,我只考虑Pojo 中存在的那些属性,我无法增加 Pojo 类中的额外属性。

所以当我要将这个list of maps 转换为list of objects 时,如下所示:-

list.collect { new Pojo(it) }

它抛出一个错误:-

groovy.lang.MissingPropertyException:没有这样的属性:param6 for 类:Pojo

这是绝对正确的,但是当我像下面这样转换时:-

list.collect { it as  Pojo } 

list*.asType(Pojo)

它不会抛出任何错误,但是当我们要获得这样的值时:-

.each { pojo ->

  pojo.param1
  ------------
  ------------
}

找不到这些值。找到的所有值都是null

当我检查使用.dump() 转换的list of objects 时,它转换为Pojo1_groovyProxy,就像代理对象一样..

所以我的问题是,在这种情况下如何转换???

【问题讨论】:

    标签: object arraylist groovy hashmap


    【解决方案1】:

    这是一种方法(如果后来将 param6 添加到类中,它会尝试保持弹性):

    (编辑:更干净,感谢tim_yates

    class Pojo {
        def param1
        def param2
        def param3
        def param4
        def param5
    
        def static build(def map) {
            def fields = Pojo.declaredFields.findAll { !it.synthetic }*.name
            def keys = map.keySet().findAll { it in fields }
            def subMap = map.subMap(keys)
            new Pojo(subMap)
        }
    }
    
    
    def newList = list.collect { Pojo.build(it) }
    

    【讨论】:

    • Pojo类中必须是static build()吗???有没有prebuild方法???
    • 代替 matcher/declaredFields 的东西,你不能这样做:def fields = Pojo.declaredFields.findAll { !it.synthetic }*.name
    • @tim_yates 你的观点给了我更多的澄清,在你的建议之前我使用了def static build(def map) {new Pojo(map.findAll { k, v -> k in Pojo.metaClass.properties*.name})}....这也正确吗????
    【解决方案2】:

    Michael Eastertim_yates 建议之后,使用以下方法实现了这一点:-

    class Pojo {
     def param1
     def param2
     def param3
     def param4
     def param5
    
    def static build(def map) {
        new Pojo(map.findAll { k, v -> k in Pojo.metaClass.properties*.name})
      }
    }
    
    def newList = list.collect { Pojo.build(it) }
    

    谢谢你给我很大的提示..:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-01
      • 2021-06-21
      • 2017-07-30
      • 2019-12-05
      • 1970-01-01
      • 1970-01-01
      • 2017-09-02
      • 2020-11-21
      相关资源
      最近更新 更多