Gson向文件写入,但不能反序列化

问题描述 投票:0回答:1

解决了。

我有一个关于用Gson写读取对象列表的问题。我有一个Product类。

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;
    }
......

然后我有一个ProductList的类

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(和产品的列表是一样的),但是我有这个错误--在线程 "main "com.google.gson.JsonSyntaxException中出现异常:java.lang.IllegalStateException: 期待BEGIN_ARRAY,但在第1行第1列路径是STRING $而这是从.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();
    }
java json gson
1个回答
0
投票

尝试使用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);
© www.soinside.com 2019 - 2024. All rights reserved.