【问题标题】:export and import gson - Failed to invoke public ) with no args导出和导入 gson - 无法调用 public ) 没有 args
【发布时间】:2021-10-28 02:07:52
【问题描述】:

我正在学习如何将数组转换为 json 文件并使用 gson 导入该数组。 我有抽象类 Shape;

public abstract class Shape {
private Type typeOfShape;

public abstract double countArea();

public abstract double countCircuit();
}

以及扩展Shape的类Circle、Rectangle、Square,例如Rectangle

public class Rectangle extends Shape {
private double a;
private double b;

public Rectangle(Type type, int a, int b) {
    super(type);
    this.a = a;
    this.b = b;
}

@Override
public double countArea() {
    return a * b;
}

@Override
public double countCircuit() {
    return a * 2 + b * 2;
}

还有两种方法:

public static List<Shape> importShapeListFromJsonWithGson(String path) throws IOException {
    Type listType = new TypeToken<List<Shape>>() {}.getType();
    Gson gson = new GsonBuilder().create();
    Reader reader = new FileReader(path);
    List<Shape> result = gson.fromJson(reader, listType);
    return result;
}

public static void exportShapeListToJsonWithGson(List<Shape> list, String path) throws IOException {
    Writer writer = new FileWriter(path);
    Gson gson = new GsonBuilder().create();
    gson.toJson(list, writer);
    writer.close();
}

但我在线程“main”中遇到异常 java.lang.RuntimeException: Failed to invoke public Shape() with no args 。 问题是,我正在使用抽象类吗?我试图从形状中删除摘要,然后再编译一次,但我得到的只是形状列表,没有例如“a”或“b”,只有类型。

【问题讨论】:

  • 我添加了这个: public Shape() {} public Shape(Type typeOfShape) { this.typeOfShape = typeOfShape; } 但它仍然不起作用
  • 我用 objectMapper 及其作品来处理这个问题,但是有没有修改 json 内容的选项?我想在类名(“shapeService.models.Circle”)之前输入 packageName。

标签: java file gson reader


【解决方案1】:

也许 Circle、Rectangle 和 Square 需要得到一个无参数的构造函数。

好的,我的回答有点太仓促了。与此同时,我试图自己解决这个任务,但不幸的是也没有成功。但是下面的 SO 展示了如何基本上解决多态列表的序列化:

https://stackoverflow.com/a/19600090/3439487

也许这对你有帮助。

【讨论】:

  • 请在您的回答中提供更多详细信息。正如目前所写的那样,很难理解您的解决方案。
猜你喜欢
  • 2017-06-08
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
  • 2012-07-09
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 2016-04-13
相关资源
最近更新 更多