2016-07-14 13 views
0

我有一个JSON文件巫婆包含给定类型的列表,例如:如何阅读JSON到集合知道实体的唯一一类与杰克逊ObjectMapper

[{ 
     "createdBy":"SYSTEM_INIT", 
     "status":401, 
     "message":"Unauthorized", 
     "description":"", 
     "lang":"en" 
    },{ 
     "createdBy":"SYSTEM_INIT", 
     "status":413, 
     "message":"Payload Too Large", 
     "description":"The request is larger than the server is willing or able to process", 
     "lang":"en" 
    }{.... 

我有一个Java类(本例称它为MyClass)女巫代表这一个实体。 当我想反序列化JSON到集合中,我只有一个Class对象,其中是MyClass.class。怎样才能读取到Collection<MyClass>

其实它的“sa春天应用程序了,这是我当前的代码:

public boolean importFromJsonFile(String table, Class clazz) { 
    Collection<Object> objectCollection = new ArrayList<>(); 

    ObjectMapper mapper = new ObjectMapper(); 
    try { 
     ClassLoader classLoader = getClass().getClassLoader(); 
     File file = new File(classLoader.getResource("init/" + table + ".import.json").getFile()); 
     objectCollection = mapper.readValue(file, Collection.class); 
    }catch (Exception e){ 
     log.error("error: ", e); 
     return false; 
    } 

    if(objectCollection.size() < 0){ 
     log.error("There is no data in the file"); 
     return false; 
    } 

    try { 
     for(Object obj : objectCollection){ 
      save(obj, clazz); 
     } 
    }catch (Exception e){ 
     log.error("fatal error: ", e); 
     return false; 
    } 

    return true; 
} 

所以在读取文件后,我的问题,其结果将是LinkedHasMap一个集合,而不是的CollectionMyClass与被这个特殊的样本中通过可变clazz表示。有没有办法做到这一点?

回答

2

有办法

List<MyClass> myObjects = Arrays.asList(mapper.readValue(file, MyClass[].class)) 

您可以得到不同的方法here,但是,这个更快。

的意见为基础(因为它提到,类变量和文件出现在运行时):

public List getObjects(Class<T> aClass, File file) throws ClassNotFoundException, IOException { 
    ObjectMapper mapper = new ObjectMapper(); 
    //Fetches Arrayed Class 
    Class namedClass = Class.forName("[L" + aClass.getName() + ";"); 
    List myObjects = Arrays.asList(mapper.readValue(file, namedClass)); 
    return myObjects; 
} 
+0

嗯,这是显而易见的,但它不能帮助我,因为MyClass的不是恒定的,它可以是MyCLass2 MyClass3和...可以是很多课程。我有一个属性设置,我希望classpaths,并获得Class对象与Class.forName();该类应与实体和表,以及获取表名,以及它的存储库等...所以我只有MyClass类对象,并且想创建一个列表或什么收集或数组 – Syngularity

+0

@Syngularity我已经更新了答案,现在你可以在运行时获得列表 –

+0

thx,这是一个很好的起点,但它需要一些修复。这一行:'List myObjects = Arrays.asList(mapper.readValue(file,namedClass));'在Object中创建一个元素获胜的列表,但实际上Object的类名为Class []。 – Syngularity