4

まず、私はこの質問をよく調べました。assets フォルダーにあるテキスト ファイルから読み取る方法を学びました。問題は、ファイルが実際にはjsonを使用して記述された配列リストであり、その配列リスト内にオブジェクトがあるため、文字列で終わりたくないことです。1 つのオブジェクトにのみアクセスする必要があります。これが私が意味することです:

章と呼ばれる int、タイトルと呼ばれる int、および pageNum と呼ばれる int を持つ Book クラスがあります。いくつかの 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();

このコードはテキスト ファイルを作成し、それをアプリに含めたいので、Android プロジェクトの /assets フォルダーに配置します。Android 以外の Java プロジェクトでは、次のコードを使用して ArrayList を再設定し、特定のインデックスから Book オブジェクトを解析できます。

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 オブジェクトを作成します。次に、ユーザーはその特定の本からの情報についてクイズを受けます。ばかげているように聞こえますが、実際のアプリはもっと​​クールです。

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

4

1 に答える 1

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 になります。これは以前にもできたことですが、必要だったのは 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 ライブラリの使用について言及したので、それを試してみたところうまくいきました。

于 2012-05-14T04:34:25.833 に答える