4

次のようなJson配列を解析しようとしています:

{
  "FoodItemData": [
      {
        "country": "GB",
        "id": "100",
        "name": "Steak and Kidney Pie",
        "description": "Tender cubes of steak, with tender lamb kidney is succulent rich gravy.  Served with a side of mashed potatoes and peas.",
        "category": "Dinner",
        "price": "15.95"
      },
      {
        "country": "GB",
        "id": "101",
        "name": "Toad in the Hole",
        "description": "Plump British Pork sausages backed in a light batter.  Served with mixed vegetables and a brown onion gravy.",
        "category": "Dinner",
        "price": "13.95"
      },
      {
        "country": "GB",
        "id": "102",
        "name": "Ploughman’s Salad",
        "description": "Pork Pie, Pickled Onions, Pickled relish Stilton and Cheddar cheeses and crusty French bread.",
        "category": "Lunch",
        "price": "10.95"
      }
]
}

GsonこのJsonを解析するために使用しています。

URL url = getClass().getClassLoader().getResource("FoodItemData.json");

        FileReader fileReader = null;
        try {
            fileReader = new FileReader(url.getPath());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        JsonReader jsonReader = new JsonReader(fileReader);
        Gson gson = new Gson();
        JsonParser parser = new JsonParser();
        JsonArray Jarray = parser.parse(jsonReader).getAsJsonArray();

        List<FoodItem> listOfFoodItems = new ArrayList<FoodItem>();

        for (JsonElement obj : Jarray) {
            FoodItem foodItem = gson.fromJson(obj, FoodItem.class);
            listOfFoodItems.add(foodItem);
        }

このコードはjava.lang.IllegalStateException: This is not a JSON Array例外になります。このFoodItemクラスには、Json と同じ名前の変数が含まれています。

public class FoodItem {
    private String id;
    private String name;
    private String description;
    private String category;
    private String price;
    private String country;
}

ここで何か不足していますか?この回答に記載されている次のコードを使用してみましたが、その質問で言及されているものと同じ例外が発生しました。どんな助けでも大歓迎です。

Gson gson = new GsonBuilder().create();
Type collectionType = new TypeToken<List<FoodItem>>(){}.getType(); 
List<FoodItem> foodItems = gson.fromJson(jsonReader, collectionType);
4

2 に答える 2

10

これを変更する必要があります

JsonArray jarray = parser.parse(jsonReader).getAsJsonArray();

JsonArray jarray = (JsonArray) parser.parse(jsonReader).getAsJsonObject().get("FoodItemData");

JSON には、ルートに という JSON オブジェクトが含まれていますFoodItemData。その要素には、マップしようとしている JSON 配列が含まれていますList<FoodItem>

FoodItemDataまたは、というフィールドを持つクラスを作成することもできます。List<FoodItem>

public class RootElement {
    List<FoodItem> FoodItemData;
    // the good stuff
}

そして、そのように解析します

RootElement root = gson.fromJson(jsonReader, RootElement.class);
System.out.println(root.FoodItemData);

また、Java の慣例では、変数名は小文字で始める必要があることに注意してください。

于 2013-11-05T01:44:35.940 に答える
1

@Sotirios が正しく述べたように、JSON は配列を含むオブジェクトであり、スタンドアロンの配列ではありません。

ただし、わずかな変更を行います(キャストの代わりに使用しますgetAsJsonArray):

 JsonArray Jarray = parser.parse(jsonReader).getAsJsonObject().getAsJsonArray("FoodItemData");
于 2013-11-05T01:48:06.393 に答える