当前位置: 首页 > 知识库问答 >
问题:

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

周墨一
2023-03-14

解决了。

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();
        }
    }
{
  "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
    }
  ]
}
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);
}

我在成员的帮助下找到的解决方案:

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个答案

郎言
2023-03-14

尝试像序列化一样使用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);
 类似资料:
  • 我有一个简单的Json结构,比如: 我设计了以下类来反序列化它: 我需要将反序列化分为两个阶段: 1-反序列化以读取。 2.2基于MessageType进行其余的反序列化 代码很简单: 我的程序可以输入正确的(即),但它不能正确解析它(println打印0而不是12) 你觉得我哪里做错了?谢谢你们

  • 问题内容: 在使用REST和JSON帖子对.NET桌面应用程序与Java服务器之间的通信进行原型设计时,我遇到了区分大小写的问题。.NET对象在Pascal Casing(这是.NET的常规属性)中具有那里的属性,例如:( 等),而同一对象的Java表示使用驼峰式大小写,例如。 服务器接收的json值为: 但是Gson不会以不区分大小写的方式反序列化。有什么办法可以让Gson做到这一点? 问题答案

  • 问题内容: 我正在使用gson改造,将json反序列化为领域对象。在大多数情况下,这非常有效。处理时出现麻烦 RealmList(String(或任何其他基本数据类型)) 由于Realm不支持E不扩展Realm对象的RealmList,因此我将String封装在RealmObject中。 我的领域对象如下 SimpleRealmObj正常工作,因为它只有String元素 如何反序列化stringS

  • 我有以下JSON示例: 我想使用GSON来反序列化这个JSON字符串,并只获取“famousId”成员的值。 我已经看过了其他答案,似乎我绝对需要为此创建类。 有没有可能不映射POJO,使用JsonParser,JsonElement,JsonArray等反序列化?我已经尝试了几种排列,但没有成功。 我也尝试过以下代码,但也没有按预期工作: 不幸的是,这也不起作用,所以我想一个两部分的问题。。。可

  • 问题内容: 我想通过Google Gson传输列表对象,但是我不知道如何反序列化泛型类型。 看了这个之后我尝试了什么(BalusC的答案): 但是后来我在日食中遇到了一个错误,说“新的List(){}类型必须实现继承的抽象方法…”,如果我使用快速修复方法,则会得到20个以上的方法存根的怪物。 我很确定有一个更简单的解决方案,但是我似乎找不到它! 编辑: 我现在有 但是,我确实在“ fromJson

  • 问题内容: 由于要执行处理的业务逻辑,因此我正在实现自定义。但是某些部分可以解析为标准方式。这是否可能- 我自己处理一些元素,并让一些嵌套元素自动处理? 这是JSON: 这是项的自定义反序列化器: 现在,我想让GSON解析枚举。我可以自己完成,这只是几行代码,但是我更愿意库做很多。 问题答案: …但是我希望图书馆尽其所能。 好吧,只需使用Gson。 有数据传输对象模式,尤其是Gson映射类,可以完