Android-обновление SQLite с ответом GSON ... как мне разобрать вложенный JSON? - PullRequest
1 голос
/ 10 июня 2011

Я попытался выяснить это самостоятельно ... начиная с двух превосходных учебных пособий по синтаксическому анализу 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.

1 Ответ

1 голос
/ 10 июня 2011

Gson не знает, что вы хотите связать атрибут jsonPlots.PlantArray с элементом "Plants" JSON, потому что имена не совпадают и отсутствует какая-либо информация о конфигурации (например, @SerializedName("Plants")), иначедай знать Гсону, чтобы связать их.

...