Я попытался выяснить это самостоятельно ... начиная с двух превосходных учебных пособий по синтаксическому анализу GSON из High-Speed Blog и Java Code Geeks .Несколько [ответов] (/3440993/gson-i-deserializatsiya-massiva-obektov-s-massivami-v-nem#3440998) для stackoverflow важны, но мне нужна больше помощи, чем скриншот. Я хочу обновить свою базу данных SQLite из следующего ответа JSON:
{
"Field": "13",
"Plants": [
{
"PlantID": 123,
"PlotID": 321,
"Row": 1,
"Post": 1,
"Position": 1,
"PlotName": "Sunnyside",
"Breed": "Daisy"
},
{
"PlantID": 149,
"PlotID": 348,
"Row": 1,
"Post": 20,
"Position": 1,
"PlotName": "Waterside",
"Breed": "Iris"
}
]
}
мой корневой класс (jsonPlots)и «вложенный» класс (Plants):
public class jsonPlots {
@SerializedName("Field")
public String mFieldId;
public ArrayList<Plants> PlantArray;
}
public class Plants {
@SerializedName("PlantID")
public int jPlantID;
@SerializedName("PlotID")
public int jPlotID;
@SerializedName("Row")
public int jRow;
@SerializedName("Post")
public int jPost;
@SerializedName("Position")
public int jPosition;
@SerializedName("PlotName")
public String jPlotName;
@SerializedName("Breed")
public String jBreed;
}
Я подтвердил, что получаю правильный ответ, используя следующий фрагмент:
public void getJsonData() {
InputStream source = retrieveStream(url);
Gson gson = new Gson();
Reader reader = new InputStreamReader(source);
jsonPlots response = gson.fromJson(reader, jsonPlots.class);
Toast.makeText(this, response.mFieldId, Toast.LENGTH_SHORT).show(); // this works
ArrayList<Plants> results = response.PlantArray;
if(results.isEmpty()) { /// null pointer exception here
Toast.makeText(this, "no data to update", Toast.LENGTH_SHORT).show();
}
else {
for (Plants result : results) {
try {
Toast.makeText(this, result.jBreed, Toast.LENGTH_SHORT).show(); // replace with SQLite update
Toast.makeText(this, result.jPlotName, Toast.LENGTH_SHORT).show();
}
finally {
Toast.makeText(this, "failed", Toast.LENGTH_SHORT).show();
}
}
}
} // getJsonData
Первый тост (mFieldID) работает. Он вылетает при if (results.isEmpty ()) с исключением нулевого указателя, как отмечалось. Мой ArrayList не заполняется?... чтобы я мог систематически обновлять свою базу данных SQLite.