如何通过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
相关产品推荐
相关产品推荐

