Gson записывает в файл, но не может десериализовать - PullRequest
1 голос
/ 05 мая 2020

РЕШЕНО.

У меня вопрос по поводу записи / чтения списка объектов с помощью 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();
    }

1 Ответ

0 голосов
/ 05 мая 2020

попробуйте использовать ProductMenu, как в сериализации

public List<Product> importProducts2() {
    Gson gson = new Gson();
    ProductMenu productMenu = gson.fromJson(new InputStreamReader(...), ProductMenu.class);
    return productMenu.productList
}

Или сериализовать простой список

gson.toJson(shopItems.productList, writer);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...