Вопрос по json, android, arraylist – Читать JSON из папки / assets в ArrayList в Android?

4

Во-первых, я много исследовал этот вопрос. Я научился читать из моего текстового файла в папке активов. Проблема в том, что я не хочу заканчиваться строкой, потому что файл на самом деле является массивом, написанным с использованием json, а внутри этого массива - объекты. Мне нужно получить доступ только к одному объекту. Вот что я имею в виду:

У меня есть класс Book, в котором есть int с именем chapter, int с названием title и int с именем pageNum. Я создал несколько объектов Book и добавил их в ArrayList. Затем я использовал следующий код для записи моего ArrayList в текстовый файл (в обычном проекте Java):

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

Этот код создает текстовый файл, который я затем помещаю в папку / assets в моем проекте Android, потому что я хочу, чтобы он был включен в приложение. В java-проекте, отличном от Android, я мог бы просто использовать следующий код для повторного заполнения ArrayList, чтобы можно было проанализировать объекты Book по определенным индексам:

<code>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
</code>

Используемый мной код json взят с сайта quickconnectfamily.org. Вы должны добавить файл с именем qc_json.jar в путь сборки вашего проекта.http://www.quickconnectfamily.org/qcjson/more.html

Проблема в Android заключается в том, что, когда я читаю файл с помощью InputStream, я могу получить только весь файл в строку, приведенный выше код не работает в Android. Я не могу обернуть JSONInputStreams вокруг InputStream, только вокруг FileInputStream. Но, кажется, я не могу использовать FileInputStream.

Так что мне нужен способ создать ArrayList, а не строку в моем приложении для Android. Не отдавая слишком много информации о моем приложении, приложение генерирует случайное число и создает объект Book из этого индекса в ArrayList. Затем пользователя опрашивают с информацией из этой конкретной книги. Звучит глупо, но настоящее приложение намного круче.

Я открыт для решений, альтернативных методов хранения объектов в текстовом файле и т. Д. Просьба не просто публиковать критику по поводу моей грамматики, синтаксиса или идеи приложения. Я довольно новичок в разработке приложений, и мне наплевать на личные мнения. Если кто-то хочет увидеть я могу загрузить больше кода, но на данный момент он не нужен. Благодарю.

Я пытался Джексон, но я продолжал получать исключение classCastException. Спасибо за помощь, хотя я действительно нашел решение, и я опубликую его как ответ. sharkonaut
Вы можете прочитать файл как строку и использовать gson для десериализации его в объект.sites.google.com/site/gson/… Steffen Stenersen
Хммм похожеthe docs state что равнинаInputStream допустимо ... Конечно, вы можете использовать другую библиотеку (например, Джексона) или использовать базу данных SQLite. dmon

Ваш Ответ

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 в ArrayList of Book объектов. Вот как я это сделал:

//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 для Androidorg.json и поэтому я попробовал это, и это сработало.

Похожие вопросы