You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 18:04:09