如何处理RestTemplate.postForObject返回的JSON并提取idToken?
嘿,我来帮你搞定这个问题!要提取返回JSON里的idToken,其实有几种很靠谱的方式,而且我也会帮你理清JSONObject和JsonObject的区别~
首先先澄清你提到的两个类的差异:
- 旧的
org.json.JSONObject是一个第三方库(org.json:json)里的工具类,风格偏字符串直接解析,用法比较简单但不属于Java标准API; - 新的
jakarta.json.JsonObject是Jakarta EE(原Java EE)的标准JSON处理API(JSR 374),属于官方规范,用法更面向对象,不过需要配合解析器使用。
另外Spring生态里常用的Jackson库还有JsonNode,也是处理JSON的好选择。
接下来给你三种可行的解决方案,按推荐程度排序:
方案1:自定义响应实体类(最推荐,类型安全)
这种方式最规范,完全符合Spring的最佳实践,类型安全还不容易出错。你只需要创建一个和返回JSON结构匹配的实体类:
public class FirebaseAuthResponse { private String idToken; private String refreshToken; private String expiresIn; // 必须要有无参构造器(Spring反射实例化需要) public FirebaseAuthResponse() {} // Getter和Setter方法 public String getIdToken() { return idToken; } public void setIdToken(String idToken) { this.idToken = idToken; } public String getRefreshToken() { return refreshToken; } public void setRefreshToken(String refreshToken) { this.refreshToken = refreshToken; } public String getExpiresIn() { return expiresIn; } public void setExpiresIn(String expiresIn) { this.expiresIn = expiresIn; } }
然后修改你的sendEmail方法,把postForObject的返回类型改成这个实体类:
public void sendEmail() throws FirebaseAuthException { Body body = new Body(firebase.createCustomToken("username"), true); RestTemplate t = new RestTemplate(); FirebaseAuthResponse response = t.postForObject( "https://identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken?key=[API_KEY]", body, FirebaseAuthResponse.class ); // 直接获取idToken String idToken = response.getIdToken(); // 后续可以用这个token做其他操作 }
方案2:用Jackson的JsonNode(灵活快捷,无需实体类)
如果不想创建实体类,Spring默认集成的Jackson库提供了JsonNode,可以灵活解析JSON:
import com.fasterxml.jackson.databind.JsonNode; public void sendEmail() throws FirebaseAuthException { Body body = new Body(firebase.createCustomToken("username"), true); RestTemplate t = new RestTemplate(); JsonNode response = t.postForObject( "https://identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken?key=[API_KEY]", body, JsonNode.class ); // 提取idToken String idToken = response.get("idToken").asText(); }
这种方式适合临时处理简单的JSON结构,不需要额外依赖,Spring已经自带Jackson。
方案3:用Jakarta JsonObject(标准API)
如果你想用标准的jakarta.json.JsonObject,需要先把响应转换成字符串,再用标准API解析:
import jakarta.json.Json; import jakarta.json.JsonObject; import java.io.StringReader; public void sendEmail() throws FirebaseAuthException { Body body = new Body(firebase.createCustomToken("username"), true); RestTemplate t = new RestTemplate(); // 先获取响应字符串 String responseStr = t.postForObject( "https://identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken?key=[API_KEY]", body, String.class ); // 解析成JsonObject JsonObject jsonObject = Json.createReader(new StringReader(responseStr)).readObject(); String idToken = jsonObject.getString("idToken"); }
注意:这种方式需要引入Jakarta JSON Processing的依赖,比如Maven中添加:
<dependency> <groupId>jakarta.json</groupId> <artifactId>jakarta.json-api</artifactId> <version>2.1.2</version> </dependency> <dependency> <groupId>org.glassfish</groupId> <artifactId>jakarta.json</artifactId> <version>2.0.1</version> <scope>runtime</scope> </dependency>
最后再补充下旧的org.json.JSONObject的用法(如果你需要兼容旧代码):
import org.json.JSONObject; public void sendEmail() throws FirebaseAuthException { Body body = new Body(firebase.createCustomToken("username"), true); RestTemplate t = new RestTemplate(); String responseStr = t.postForObject("https://identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken?key=[API_KEY]", body, String.class); JSONObject jsonObject = new JSONObject(responseStr); String idToken = jsonObject.getString("idToken"); }
这个需要引入org.json:json依赖,不过因为它是非标准库,现在更推荐用前面的方案。
内容的提问来源于stack exchange,提问作者YPD
相关产品推荐
相关产品推荐

