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

如何处理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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:58:00