使用Java在Eclipse中读取JSON文件时获取空值

问题描述:

我正在读取放入项目文件夹中的JSON文件.我没有收到文件不存在的错误,并且在添加该行以忽略未知值之前,我遇到了错误.因此,我很确定它正在读取值.我遇到的问题是,当我尝试从JSON文件中打印出变量时,我得到了空值.

I am reading in a JSON file that I put in my project folder. I am not getting an error that the file doesn't exist and before I added the line to ignore unknown values I was getting errors. So I am pretty sure it is reading values in. The problem I am having is when I try to print out variables from the JSON file I get null values.

File jsonFile = new File("FoodItemData.json");
    FoodItemData food = null;
    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    try {
        food = mapper.readValue(jsonFile, FoodItemData.class);
        System.out.println(food.getcountry());
        System.out.println(food.getId());
        System.out.println(food.getDescription());
        System.out.println(food.getcountry());
        System.out.println(food);
    } catch (JsonParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (JsonMappingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    System.out.println(food.getcountry());

我调用FoodItemData类,并且所有获取的返回null.

I call the class FoodItemData and it returns null for all the gets.

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

public String getcountry(){
    return this.country;
}
public void setcountry(String country){
    this.country = country;
}
public String getCategory(){
    return this.category;
}
public void setCategory(String category){
    this.category = category;
}
public String getDescription(){
    return this.description;
}
public void setDescription(String description){
    this.description = description;
}
public String getId(){
    return this.id;
}
public void setId(String id){
    this.id = id;
}
public String getName(){
    return this.name;
}
public void setName(String name){
    this.name = name;
}
public String getPrice(){
    return this.price;
}
public void setPrice(String price){
    this.price = price;
}

}

这是我的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"
  }
]

}

我在做什么错了?

正如@Jonathan指出的那样,实际上在 FoodItemData.json 文件中没有对象,而是实际上具有了 Map ,其中包含单个键和一个数组作为值.因此,为了读取文件的内容,您可以做的最简单的操作(使用 Gson lib com.google.gson.Gson ):

As @Jonathan pointed out instead of having an object inside of FoodItemData.json file you actually have a Map with single key and an array as value. So the minimum what you can do is this (using Gson lib com.google.gson.Gson) in order to read the content of the file:

BufferedReader reader = null;
try {
    reader = new BufferedReader(new FileReader(new File("./FoodItemData.json")));
    Map<String, List<FoodItemData>> object = (new Gson()).fromJson(reader, new TypeToken<Map<String, List<FoodItemData>>>(){}.getType());
    List<FoodItemData> data;
    if (object.values().iterator().hasNext()){
        data = object.values().iterator().next(); // this is you data in your case 3 FoodItemData entries
    }
} catch (FileNotFoundException e) {
    ....
}finally{
    if (reader != null) {
        try {
            reader.close();
        } catch (IOException e) {
            ....
        }
    }
}

还请注意,一旦执行此操作,因为在json文件所在的国家/地区以-开头,它将不会进入

Also note that once you do this, because in your json file country starts with - it will not get in