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

如何通过Spring Rest Template获取Firebase自动生成键的JSON数据?

解决Firebase动态键JSON映射到Spring Boot对象的问题

你遇到的问题核心在于:Firebase返回的JSON是以动态生成ID为键、School对象为值的映射结构,但你直接用School.class接收,结构完全不匹配——单个School类对应JSON里的一个子对象(比如alanisawesome的值),而整个返回结果是多个这类子对象的集合。

下面给你两种简单可行的解决方案:

方案1:直接用Map<String, School>接收数据

这是最直接的方式,不需要额外创建类。利用Spring的ParameterizedTypeReference处理泛型映射,避免类型擦除问题:

import org.springframework.core.ParameterizedTypeReference;
import org.springframework.web.client.RestTemplate;
import org.springframework.http.HttpMethod;
import java.util.Map;

// 初始化RestTemplate并发起请求
RestTemplate restTemplate = new RestTemplate();
String firebaseUrl = "https:<FIREBASE>.firebaseio.com/School.json";

// 用ParameterizedTypeReference指定泛型类型
Map<String, School> schoolMap = restTemplate.exchange(
    firebaseUrl,
    HttpMethod.GET,
    null,
    new ParameterizedTypeReference<Map<String, School>>() {}
).getBody();

// 遍历Map获取所有数据
for (Map.Entry<String, School> entry : schoolMap.entrySet()) {
    String firebaseId = entry.getKey(); // 对应alanisawesome、gracehop这类动态键
    School school = entry.getValue(); // 对应的学校对象
    // 这里可以根据需求处理数据,比如打印或存入数据库
    System.out.println("Firebase ID: " + firebaseId + " | 学校:" + school.getName() + ",城市:" + school.getCity());
}

如果习惯用getForObject,也可以这么写:

Map<String, School> schoolMap = restTemplate.getForObject(
    firebaseUrl,
    new ParameterizedTypeReference<Map<String, School>>() {}
);

方案2:创建包装类封装Map

如果希望代码结构更清晰,可以创建一个专门的响应类来包装这个映射:

// 自定义响应包装类
public class SchoolResponse {
    private Map<String, School> schools;

    // Getter和Setter
    public Map<String, School> getSchools() {
        return schools;
    }

    public void setSchools(Map<String, School> schools) {
        this.schools = schools;
    }
}

然后调用时用这个包装类接收:

SchoolResponse response = restTemplate.getForObject(firebaseUrl, SchoolResponse.class);
Map<String, School> schoolMap = response.getSchools();
// 后续遍历处理和方案1一致

额外小技巧:转换成List

如果需要把所有School对象转换成List,直接用Map的values()方法即可:

import java.util.ArrayList;
import java.util.List;

List<School> schoolList = new ArrayList<>(schoolMap.values());

这样就能轻松获取到所有学校的列表了~

内容的提问来源于stack exchange,提问作者RenceAbi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:04:30