Gson 写入文件,但无法反序列化



已解决。

我有一个关于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;
}
......

然后我有一个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();
}

尝试在序列化中使用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);

最新更新