2012-05-13 84 views
4

首先,我研究了很多這個問題。我學會了如何從資產文件夾中的文本文件讀取數據。問題是,我不想結束一個字符串,因爲該文件實際上是一個使用json編寫的arraylist,並且裏面的arraylist是對象。我只需要訪問一個對象。我的意思是:從/ assets文件夾中讀取JSON到Android中的ArrayList?

我有一個Book類,它有一個叫做章的int,一個叫做title的int和一個叫做pageNum的int。我創建了幾個Book對象並將它們添加到ArrayList中。然後我用下面的代碼來寫我的ArrayList到一個文本文件(在常規的Java項目):

ArrayList<Book> aList = new ArrayList<Book>(); 
aList.add(book1); 
//etc...add more Book objects here... 

File aFile = new File("books.txt"); 
FileOutputStream aFileStream = new FileOutputStream(aFile); 
JSONOutputStream jsonOut = new JSONOutputStream(aFileStream); 
jsonOut.writeObject(aList); 
jsonOut.close(); 

該代碼創建一個文本文件,然後我放到/ assets文件夾在我的Android項目,因爲我希望它包含在應用程序中。在非Android的Java項目,我可以簡單地使用下面的代碼重新填充一個ArrayList,這樣我可以從具體指標解析書obects:

File bFile = new File("books.txt"); 
FileInputStream bFileStream = new FileInputStream(bFile); 
JSONInputStream jsonIn = new JSONInputStream(bFileStream); 
Arraylist<Book> bList = (ArrayList<Book>) jsonIn.readObject(); 
Book aBook = bList.get(253); //some arbitrary index 

我使用JSON代碼來自quickconnectfamily.org。您必須將名爲qc_json.jar的文件添加到項目的構建路徑中。 http://www.quickconnectfamily.org/qcjson/more.html

Android中的問題是當我使用InputStream讀取文件時,我只能將整個文件轉換爲字符串,上面的代碼在Android中不起作用。我無法將JSONInputStreams包裝在InputStream中,只能圍繞FileInputStream。但似乎我無法使用 FileInputStream。

所以我需要的是一種在我的Android應用程序中創建ArrayList而不是字符串的方法。 沒有放棄太多關於我的應用程序,應用程序基本上會生成一個隨機數並從ArrayList中的該索引創建一個Book對象。然後用該特定書籍的信息來詢問用戶。聽起來很愚蠢,但真正的應用程序更酷。

我對解決方案,將對象存儲在文本文件等中的替代方法持開放態度。請不要簡單地發表關於我的語法,語法或應用程序想法的批評。我對應用程序開發非常陌生,我也不太在意個人意見。如果有人想看 更多的代碼,我可以上傳它,但在這一點上似乎沒有必要。謝謝。

+0

嗯,似乎像[文檔狀態](http://www.quickconnectfamily.org/qcjson/docs/org/quickconnect/json/JSONInputStream.html),一個普通的'InputStream'是有效的......當然,你可以使用另一個庫(例如Jackson),或者使用SQLite DB。 – dmon

+0

您可以以字符串形式讀取文件,並使用gson將其反序列化爲對象。 https://sites.google。com/site/gson/gson-user-guide#TOC-Collections-Examples –

+0

我試過傑克遜,但是我不斷收到一個classCastException。感謝您的幫助,但我確實找到了解決方案,並將其作爲答案發布。 –

回答

16

我想出瞭解決方案。我連接了我的Evo 4G並測試了該應用程序,它工作正常。下面是我所做的:

我用下面的方法從文件,這是我在做什麼之前閱讀:當你這樣做,你結束了整個文件的字符串

InputStream is = appContext.getAssets().open("books.txt"); 
int size = is.available(); 
buffer = new byte[size]; 
is.read(buffer); 
is.close(); 
String bufferString = new String(buffer); 

。這是我以前能夠做到的,但我想要的是將String轉換爲Book對象的ArrayList的方法。以下是我做到了這一點:

//convert string to JSONArray 
jsonArray = new JSONArray(bufferString); 
//parse an Object from a random index in the JSONArray 
JSONObject anObject = jsonArray.getJSONObject(randomNum); 

Book aBook = new Book(); 
aBook.setTitle((String) anObject.get("title")); 
//you can continue to set the different attributes of the Book object using key/value pairs from the Book class (e.g. setPageNum, setChapter, etc). 

我不知道,也許這是很明顯的一些人,但我真的找不到任何做任何的例子。在另一個問題有人提到使用Android org.json原生JSON庫,所以我嘗試了它,它的工作。

相關問題