【问题标题】:Error in converting an object with JavaFX CheckBox attribute to a JSON string using GSON使用 GSON 将具有 JavaFX CheckBox 属性的对象转换为 JSON 字符串时出错
【发布时间】:2022-01-25 11:30:48
【问题描述】:

简单解释一下,我有一个Task 对象,我想使用 GSON 库将其转换为 JSON 字符串。该对象本身具有 String 和 int 属性,我可以将其转换为 JSON 就好了,但是当我向类添加 CheckBox 属性时,会出现此错误消息

原因:java.lang.reflect.InaccessibleObjectException:无法使字段私有 javafx.beans.property.BooleanProperty javafx.scene.control.CheckBox.indeterminate 可访问:模块 javafx.controls 没有“打开 javafx. scene.control" 到模块 gson 在 java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:349) 在 java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:289) 在 java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:174) 在 java.base/java.lang.reflect.Field.setAccessible(Field.java:168) 在 gson@2.8.2/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:157) 在 gson@2.8.2/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:100) 在 gson@2.8.2/com.google.gson.Gson.getAdapter(Gson.java:423) 在 gson@2.8.2/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:115) 在 gson@2.8.2/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:164) 在 gson@2.8.2/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:100) 在 gson@2.8.2/com.google.gson.Gson.getAdapter(Gson.java:423) 在 gson@2.8.2/com.google.gson.Gson.toJson(Gson.java:661) 在 gson@2.8.2/com.google.gson.Gson.toJson(Gson.java:648) 在 gson@2.8.2/com.google.gson.Gson.toJson(Gson.java:603) 在 gson@2.8.2/com.google.gson.Gson.toJson(Gson.java:583) 在 IAssessment/application.AddTaskController.addTask(AddTaskController.java:45)

我事先有类似的东西,我在这里询问过(错误消息以不导出到 gson 结尾),解决方案是创建一个看起来像这样的类模块信息

exports snippet;
exports application;
requires gson;
requires java.sql;
requires javafx.base;
requires javafx.controls;
requires javafx.fxml;
requires javafx.graphics;
opens application to gson, javafx.fxml;

这解决了我以前的问题,但这似乎是一个类似的问题,我不知道该怎么办。那么有没有办法解决呢?我感谢任何和所有的帮助。

【问题讨论】:

  • 您为什么首先尝试将CheckBox 导出为 JSON?这似乎是一件奇怪的事情,您通常只将数据导出到 JSON,而不是整个 UI 元素。
  • 复选框是布尔值的 UI 表示形式(选中或未选中)。所以你的数据模型应该包含一个字符串、日期和布尔值。数据模型中不应该有 UI 元素。
  • 提示:将堆栈跟踪格式化为代码。这种方式更容易阅读。
  • 永远不要在您的数据中存储节点..
  • 简而言之:您应该使用cellValueFactory 指定每列应显示的数据(“值”)。 (在您的情况下为字符串、日期、布尔值。)您应该在必要时使用cellFactory 来指定列应如何显示数据(第三列使用CheckBoxTableCell)。要让复选框表格单元格处理数据,您需要使用 BooleanProperty 来表示布尔值。因为 GSON only 使用字段,它会尝试序列化 BooleanProperty 而不是其底层布尔值。 (这是 GSON imo 的一个愚蠢的设计决定。)

标签: java json javafx gson


【解决方案1】:

想通了

(tablecolumnname).setCellFactory(new Callback<TableColumn<(object), Boolean>, TableCell<(object), Boolean>>() {

        public TableCell<(object), Boolean> call(TableColumn<(object), Boolean> p) {
            return new CheckBoxTableCell<(object), Boolean>();
        }

    });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多