【发布时间】:2020-04-05 21:09:16
【问题描述】:
初学者!
我有一个测验应用程序full code on Github,它加载了一个带有来自json 的四个参数的List(数据以前存储在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:应为字符串,但在第 1 行第 118 列路径 $[0].answerOptions[0]
处为 BEGIN_OBJECT
那是因为我已经将所有请求的数据类型声明为字符串,而显然我有一个混合类型的数组(一个对象和一个数组):
@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();
}
...
我可以在桥接类中实现解决方案here:
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 获取子列表?
编辑:
在@andy-turner 推荐的更改之后,我收到了错误:
org.litepal.exceptions.LitePalSupportException:尝试在空对象引用上调用虚拟方法 'java.lang.Class[] 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 列也没有显示
【问题讨论】: