2012-05-13 13 views
4

まず、私はこの質問をたくさん研究しました。私はassetsフォルダのテキストファイルから読み込む方法を学びました。問題は、ファイルが実際にjsonを使用して書かれたarraylistであり、arraylistがオブジェクトであるため、私は文字列で終わりたくないということです。 1つのオブジェクトにのみアクセスする必要があります。JSONを/ assetsフォルダからAndroidのArrayListに読み込みますか?

私は章と呼ばれるint、titleと呼ばれるint、およびpageNumというintを持つBookクラスを持っています。私はいくつかのブックオブジェクトを作成し、それらをArrayListに追加しました。その後、私は(通常のJavaプロジェクトでの)テキストファイルに私のArrayListを書くために、次のコードを使用:

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(); 

このコードは、私はその後、私はので、私のAndroidのプロジェクトに/資産フォルダに入れたテキストファイルを作成しますそれはアプリに付属したい。私が使用している

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から来ている:私は、特定のインデックスからブックobectsを解析することができるように非AndroidのJavaプロジェクトでは、私は単にのArrayListを再作成するには、次のコードを使用することができます。 qc_json.jarというファイルをプロジェクトのビルドパスに追加する必要があります。 http://www.quickconnectfamily.org/qcjson/more.html

Androidの問題は、InputStreamを使用してファイルを読み込んだときにファイル全体を文字列にすることができます。上記のコードはAndroidでは動作しません。私はFileInputStreamの周りだけで、InputStreamの周りにJSONInputStreamsをラップすることはできません。しかし、私は FileInputStreamを使用することができないようです。

私が必要とするのは、Androidアプリで文字列ではなくArrayListを作成する方法です。 アプリについてあまりにも多くの情報を与えることなく、アプリは基本的に乱数を生成し、そのインデックスからBookListオブジェクトをArrayListに作成します。その後、ユーザーはその特定の本からの情報でクイズされます。愚かな音だが、実際のアプリははるかにクーラーです。

私は解決策、テキストファイルにオブジェクトを格納する代替方法などを公開しています。文法、構文、またはアプリケーションの考え方についての批判を投稿しないでください。私はアプリの開発にはかなり新しいので、私は個人的な意見についてはあまり気にすることができませんでした。もし誰かがもっと多くのコードを で見ることができたら、私はそれをアップロードすることができますが、この時点では必要ないようです。ありがとう。

+0

Hmmmmは普通の 'InputStream'が有効である[docs状態](http://www.quickconnectfamily.org/qcjson/docs/org/quickconnect/json/JSONInputStream.html)のようです...もちろん、別のライブラリ(Jacksonなど)を使用することも、SQLite DBを使用することもできます。 – dmon

+0

ファイルを文字列として読み込み、gsonを使用してファイルをオブジェクトに逆シリアル化することができます。 https://sites.google。com/site/gson/gson-user-guide#TOC-Collections-Examples –

+0

私はJacksonを試しましたが、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). 

私は多分それは一部の人には明らかだった、知りませんが、私は本当にこれをしなかった任意の例を見つけることができませんでした。別の質問で、誰かがjsonライブラリのAndroid org.jsonをネイティブで使っていると言いましたので、私はそれを試してみました。

関連する問題