如何在JavaFX中读取本地JSON文件并将指定客户数据填充到TableView
最简单的JavaFX+Gson JSON读取与TableView填充方案
既然你已经用了Gson的@SerializedName注解,那直接用Gson来解析JSON就是最省事的方案,不用换其他库。我会一步步帮你完善代码:
1. 给Customer类添加购买总额计算方法
因为TableView需要展示每个客户的购买总额,我们直接在Customer类里加一个计算逻辑:
public class Customer { // 已有的字段和方法不变 // 计算该客户的所有购买总额(用salePrice累加) public double getSumOfPurchases() { if (m_product == null || m_product.length == 0) { return 0.0; } double total = 0.0; for (Product product : m_product) { total += product.getSalePrice(); } return total; } }
2. 完善APIManager的JSON读取逻辑
你的JSON顶层是"Customers"数组,所以需要一个辅助类来匹配这个结构,再用Gson完成解析:
import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import java.io.InputStream; import java.io.InputStreamReader; import java.lang.reflect.Type; import java.util.List; public class APIManager { // 单例代码保持不变 private static APIManager m_instance = null; private APIManager() {} public static APIManager Instance() { if(m_instance == null) { m_instance = new APIManager(); } return m_instance; } // 读取本地JSON并返回Customer列表 public List<Customer> loadAllCustomers() { Gson gson = new Gson(); // 从resources目录读取JSON文件(推荐这种方式,打包后也能正常访问) InputStream inputStream = getClass().getClassLoader().getResourceAsStream("customers.json"); if (inputStream == null) { throw new RuntimeException("找不到customers.json文件,请检查文件路径"); } // 定义匹配JSON结构的Type Type customerResponseType = new TypeToken<CustomerResponse>() {}.getType(); CustomerResponse response = gson.fromJson(new InputStreamReader(inputStream), customerResponseType); return response.getCustomers(); } // 辅助类:对应JSON的顶层结构 private static class CustomerResponse { @SerializedName("Customers") private List<Customer> customers; public List<Customer> getCustomers() { return customers; } } }
3. 在TableViewController中配置TableView并加载数据
在initialize方法里绑定列和数据源,然后调用APIManager加载数据:
import javafx.beans.property.SimpleStringProperty; import javafx.fxml.Initializable; import javafx.scene.control.TableColumn; import javafx.scene.control.cell.PropertyValueFactory; import javafx.util.Callback; import java.net.URL; import java.util.List; import java.util.ResourceBundle; public class TableViewController implements Initializable { // 已有的FXML字段不变 @Override public void initialize(URL url, ResourceBundle resourceBundle) { // 绑定基础字段列 idColumn.setCellValueFactory(new PropertyValueFactory<>("customerId")); firstNameColumn.setCellValueFactory(new PropertyValueFactory<>("firstName")); lastNameColumn.setCellValueFactory(new PropertyValueFactory<>("lastName")); phoneColumn.setCellValueFactory(new PropertyValueFactory<>("phoneNumber")); // 绑定购买总额列(因为是计算值,需要自定义CellValueFactory) totalPurchaseColumn.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Customer, String>, javafx.beans.value.ObservableValue<String>>() { @Override public javafx.beans.value.ObservableValue<String> call(TableColumn.CellDataFeatures<Customer, String> param) { Customer customer = param.getValue(); // 格式化为两位小数的货币样式 return new SimpleStringProperty(String.format("%.2f", customer.getSumOfPurchases())); } }); // 初始化时加载所有客户 loadAllCustomers(); } @FXML private void loadAllCustomers() { try { List<Customer> customers = APIManager.Instance().loadAllCustomers(); tableView.getItems().clear(); tableView.getItems().addAll(customers); rowsInTableLabel.setText("总客户数: " + customers.size()); } catch (RuntimeException e) { e.printStackTrace(); // 这里可以加个弹窗提示用户加载失败,比如: // new Alert(Alert.AlertType.ERROR, "加载客户数据失败").show(); } } // 其他方法保持不变 }
4. 配置Gson依赖
如果用Maven,在pom.xml里添加:
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.10.1</version> <!-- 用最新稳定版即可 --> </dependency>
如果是Gradle,在build.gradle里加:
implementation 'com.google.code.gson:gson:2.10.1'
如果是手动管理jar,下载Gson的jar包加入项目即可。
注意事项
- 确保
customers.json放在项目的resources目录下(Maven/Gradle项目放在src/main/resources),这样打包后能正常访问;如果是普通JavaFX项目,调整路径为相对项目根目录的位置。 - 如果你的JSON里
id是数字类型,Customer类里m_customerId用String也没问题,Gson会自动转换;如果想改成Integer,只需要修改字段类型和getter返回类型即可。 - 购买总额的格式化可以根据需求调整,比如加货币符号
$:String.format("$%.2f", ...)
内容的提问来源于stack exchange,提问作者NewCoderBH1694
相关产品推荐
相关产品推荐

