РЕШЕНО.
У меня вопрос по поводу записи / чтения списка объектов с помощью Gson. У меня есть класс продукта:
public class Product {
private String name;
private double price;
private int quantity;
public Product(String name, double price, int quantity) {
this.name = name;
this.price = price;
this.quantity = quantity;
}
......
Затем у меня есть класс для списка продуктов:
public class ProductMenu {
public List<Product> productList;
public ProductMenu() {
productList = new ArrayList<>();
}
......
Я инициализирую свой список продуктов в другом классе:
public class ShoppingOperations {
ProductUpdater import = new ProductUpdaterFromJson();
private ProductMenu shopItems = import.importProducts();
.....
Что я хочу сделать, это инициализировать мой список продуктов в конструкторе, например:
public class ProductMenu {
public List<Product> productList;
public ProductMenu() {
ProductUpdater getList = new ProductUpdaterFromJson();
productList = getList.importProducts();
}
......
Это мой метод, который записывает в файл. json список объектов:
public class ProductUpdaterFromJson implements ProductUpdater {
public final static String PATH = "src\\shop\\products\\promenu.json5";
@Override
public void updateWarehouseData(ProductMenu shopItems) {
Gson gson = new GsonBuilder().setPrettyPrinting().create();
try {
Writer writer = new FileWriter(PATH);
gson.toJson(shopItems, writer);
writer.flush();
writer.close();
} catch (IOException e) {
System.out.println("file not found");
e.printStackTrace();
}
}
А файл. json выглядит так. Он генерируется с помощью Gson:
{
"productList": [
{
"name": "Cheese",
"price": 1.37,
"quantity": 6
},
{
"name": "Milk",
"price": 1.16,
"quantity": 7
},
{
"name": "Milka",
"price": 0.66,
"quantity": 2
},
{
"name": "Potatoes",
"price": 0.7,
"quantity": 7
},
{
"name": "Tea",
"price": 2.1,
"quantity": 4
}
]
}
Но я получаю сообщение об ошибке при попытке прочитать этот файл. Конструктор ожидает List, но мой редактор файлов пишет ProductMenu (это тот же список, что и продукты), но у меня есть эта ошибка - Exception in thread "main" com.google.gson.JsonSyntaxException: java .lang.IllegalStateException: Expected BEGIN_ARRAY но был STRING в строке 1 столбец 1 путь $ И это метод для чтения. json файл:
public final static String PATH = "src\\shop\\products\\promenu.json5";
public List<Product> importProducts2() {
Gson gson = new Gson();
Type userListType = new TypeToken<ArrayList<Product>>(){}.getType();
return gson.fromJson(PATH, userListType);
}
Как я могу решить эту проблему. Writer пишет, но невозможно прочитать файл и инициализировать список с продуктами.
Решение, которое я нашел с помощью членов:
public class ProductUpdaterFromJson implements ProductUpdater {
public final static String PATH = "src\\shop\\products\\promenu.json5";
@Override
public void updateWarehouseData(ProductMenu shopItems) {
Gson gson = new GsonBuilder().setPrettyPrinting().create();
try {
Writer writer = new FileWriter(PATH);
gson.toJson(shopItems.productList, writer);
writer.flush();
writer.close();
} catch (IOException e) {
System.out.println("file not found");
e.printStackTrace();
}
}
public List<Product> importProducts() {
Gson gson = new Gson();
List<Product> list = null;
try {
Reader reader = new FileReader(PATH);
Type userListType = new TypeToken<ArrayList<Product>>(){}.getType();
list = gson.fromJson(reader, userListType);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return list;
}
}
И конструктор:
public class ProductMenu {
public List<Product> productList;
public ProductMenu() {
ProductUpdater listFromJson = new ProductUpdaterFromJson();
productList = listFromJson.importProducts();
}