如何在Java中从JSON对象获取嵌套的roles列表?
在Java中提取JSON中的roles列表
下面介绍三种常用的Java JSON处理方案,直接实现从给定JSON中提取roles列表:
方法1:使用Jackson库
Jackson是Java生态中最常用的JSON处理工具,支持树形解析和POJO映射两种方式:
依赖引入(Maven)
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> </dependency>
树形解析(无需定义实体类)
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class JacksonTreeParse { public static void main(String[] args) throws IOException { String jsonStr = "{\n" + " \"typ\": \"Bearer\",\n" + " \"azp\": \"idp-e4f9cb79-0c4f-46a4-8b5f-34dc05e39138\",\n" + " \"session_state\": \"9698bd84-6465-4947-98e9-2b477cd119aa\",\n" + " \"acr\": \"1\",\n" + " \"resource_access\": {\n" + " \"thg-hbgs\": {\n" + " \"roles\": [\n" + " \"Admin\",\n" + " \"Manager\",\n" + " \"Clerk\"\n" + " ]\n" + " }\n" + " },\n" + " \"scope\": \"openid profile email\",\n" + " \"sid\": \"9699bd84-6465-4947-98e9-2b477cd119aa\",\n" + " \"email_verified\": true\n" + "}"; ObjectMapper mapper = new ObjectMapper(); JsonNode root = mapper.readTree(jsonStr); // 逐层定位到roles数组 JsonNode rolesNode = root.path("resource_access").path("thg-hbgs").path("roles"); List<String> roles = new ArrayList<>(); if (rolesNode.isArray()) { for (JsonNode role : rolesNode) { roles.add(role.asText()); } } System.out.println(roles); // 输出 [Admin, Manager, Clerk] } }
POJO映射(适合结构化场景)
先定义对应JSON结构的实体类:
class AuthToken { private ResourceAccess resource_access; // getter/setter public ResourceAccess getResource_access() { return resource_access; } public void setResource_access(ResourceAccess resource_access) { this.resource_access = resource_access; } } class ResourceAccess { @JsonProperty("thg-hbgs") private ThgHbgs thgHbgs; // getter/setter public ThgHbgs getThgHbgs() { return thgHbgs; } public void setThgHbgs(ThgHbgs thgHbgs) { this.thgHbgs = thgHbgs; } } class ThgHbgs { private List<String> roles; // getter/setter public List<String> getRoles() { return roles; } public void setRoles(List<String> roles) { this.roles = roles; } }
然后解析提取:
AuthToken token = mapper.readValue(jsonStr, AuthToken.class); List<String> roles = token.getResource_access().getThgHbgs().getRoles();
方法2:使用Gson库
Gson是Google推出的轻量JSON处理库,用法简洁:
依赖引入(Maven)
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.10.1</version> </dependency>
代码示例
import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import java.util.ArrayList; import java.util.List; public class GsonParse { public static void main(String[] args) { String jsonStr = "你的JSON字符串"; JsonObject root = JsonParser.parseString(jsonStr).getAsJsonObject(); JsonObject resourceAccess = root.getAsJsonObject("resource_access"); JsonObject thgHbgs = resourceAccess.getAsJsonObject("thg-hbgs"); JsonArray rolesArray = thgHbgs.getAsJsonArray("roles"); List<String> roles = new ArrayList<>(); for (int i = 0; i < rolesArray.size(); i++) { roles.add(rolesArray.get(i).getAsString()); } System.out.println(roles); } }
方法3:使用org.json库(原生风格)
适合简单场景的轻量库,无需复杂依赖:
依赖引入(Maven)
<dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20230618</version> </dependency>
代码示例
import org.json.JSONArray; import org.json.JSONObject; import java.util.ArrayList; import java.util.List; public class OrgJsonParse { public static void main(String[] args) { String jsonStr = "你的JSON字符串"; JSONObject root = new JSONObject(jsonStr); JSONObject resourceAccess = root.getJSONObject("resource_access"); JSONObject thgHbgs = resourceAccess.getJSONObject("thg-hbgs"); JSONArray rolesArray = thgHbgs.getJSONArray("roles"); List<String> roles = new ArrayList<>(); for (int i = 0; i < rolesArray.length(); i++) { roles.add(rolesArray.getString(i)); } System.out.println(roles); } }
内容的提问来源于stack exchange,提问作者Abhijit Mondal Abhi
相关产品推荐
相关产品推荐

