Начинающий!
У меня есть приложение для викторины полный код на Github , который загружает List
с четырьмя аргументами из json
(данные ранее хранились в xml
):
- вопрос
- изображение
- четыре возможных ответа, представленные в
radioGroup
(подсписок) - правильный ответ
[{
"question": "Who is the 'Modern Love' rock star singer?",
"imageUrl": "https://postimg.cc/2VL1Y1jd",
"answerOptions": [{
"1": "Jaimie Hendrix",
"2": "David Bowie",
"3": "Jim Morrison",
"4": "Elvis Presley"
}],
"correctAnswer": "David Bowie"
}]
Я получаю сообщение об ошибке
java .lang.IllegalStateException: ожидаемая строка, но была BEGIN_OBJECT в строке 1 столбца 118 путь $ [0] .answerOptions [0]
, и это потому, что я объявил все типы данных, запрошенные как строки, в то время как у меня есть массив смешанных типов (объект и массив):
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
if (response.isSuccessful()) {
String string = response.body().string();
Gson gson = new Gson();
Type type = new TypeToken<List<Quiz>>(){}.getType();
List<Quiz> list = gson.fromJson(string, type);
// Save to database
for (int i = 0; i < list.size(); i++) {
Quiz quiz = list.get(i);
quiz.save();
}
...
Я мог бы реализовать решение здесь в классе моста:
class Quiz extends LitePalSupport {
String question;
String imageUrl;
String [] answerOptions;
String correctAnswer;
Quiz(String question, String imageUrl, String [] answerOptions, String correctAnswer) {
this.question = question;
this.imageUrl = imageUrl;
this.answerOptions = answerOptions;
this.correctAnswer = correctAnswer;
}
}
, но это означает, что я буду отправлять подкласс в держатель представления адаптера, который ожидает String []
...
quizHolder.createRadioButtons(quiz.answerOptions);
...
void createRadioButtons(String[] answerOptions) {
if (radioGroup.getChildAt(0) != null)
radioGroup.removeAllViews();
for (String s : answerOptions) {
radioGroup.addView(createRadioButtonAnswerAndSetOnClickListener(s));
}
}
...
Есть ли способ получить подсписок из json без создания подкласса?
Редактировать: * 104 5 *
После рекомендованного изменения @ andy-turner я получаю сообщение об ошибке:
org.litepal.exceptions.LitePalSupportException: Попытка вызвать виртуальный метод 'java .lang. Класс [] java .lang.reflect.Constructor.getParameterTypes () 'для пустой ссылки на объект
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.celebrityquiz, PID: 6493
org.litepal.exceptions.LitePalSupportException: Attempt to invoke virtual method 'java.lang.Class[] java.lang.reflect.Constructor.getParameterTypes()' on a null object reference
at org.litepal.crud.DataHandler.query(DataHandler.java:154)
at org.litepal.crud.QueryHandler.onFindAll(QueryHandler.java:123)
at org.litepal.Operator.findAll(Operator.java:1117)
at org.litepal.Operator.findAll(Operator.java:1082)
at org.litepal.LitePal.findAll(LitePal.java:798)
at com.example.celebrityquiz.MainActivity$1$2.run(MainActivity.java:115)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
...
, вероятно, вызывается, когда я пытаюсь получить данные из базы данных:
List<Quiz> list = LitePal.findAll(Quiz.class);
И столбец answerOptions
также не отображается