2016-07-14 14 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