如何在SCIM JSON API中获取多个roles属性值?
问题
我正在使用Postman开发SCIM JSON API,目前已成功获取单个角色属性(如'user')。但现在需要获取'user'和'admin'两个角色属性,当前系统仅能返回第一个属性。以下是请求JSON示例及用于获取属性的代码片段,请问如何修改代码以成功获取两个属性?
请求单个角色的JSON
{ "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"], "Operations": [ { "op": "replace", "value": { "roles": [ { "value": "user" } ] } } ] }
请求两个角色的JSON
{ "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"], "Operations": [ { "op": "replace", "value": { "roles": [ { "value": "user" }, { "value": "admin" } ] } } ] }
原获取属性的代码片段
if (operations.getJSONObject(i).getJSONObject("value").has("roles") && operations.getJSONObject(i).getJSONObject("value") .getJSONArray("roles").getJSONObject(0).has("value")) { if (!(operations.getJSONObject(i).getJSONObject("value") .getJSONArray("roles").getJSONObject(0).getString("value") .trim().equals("") || operations.getJSONObject(i).getJSONObject("value") .getJSONArray("roles").getJSONObject(0) .getString("value").trim() == null) && operations.getJSONObject(i).getJSONObject("value") .getJSONArray("roles").length() > 0) { Value[] userInfo = new Value[1]; Value value = new Value( operations.getJSONObject(i).getJSONObject("value") .getJSONArray("roles").getJSONObject(0) .getString("value").trim(), operations.getJSONObject(i).getJSONObject("value") .getJSONArray("roles").getJSONObject(0) .getString("value").trim()); userInfo[0] = value; Operations operation = new Operations( operations.getJSONObject(i).getString("op").trim(), "operations.value.roles.value", userInfo); operationsObjArr[i] = operation; } else { proceed = false; break; } }
解决方案
原代码的核心问题是硬编码只处理roles数组的第一个元素,并且固定创建长度为1的Value[]数组,导致无法兼容多角色场景。修改思路是遍历roles数组的所有元素,批量处理并动态生成对应长度的结果数组。
修改后的代码如下:
if (operations.getJSONObject(i).getJSONObject("value").has("roles")) { JSONArray rolesArray = operations.getJSONObject(i).getJSONObject("value").getJSONArray("roles"); // 校验所有角色的value字段是否合法 boolean allRolesValid = true; for (int j = 0; j < rolesArray.length(); j++) { JSONObject roleObj = rolesArray.getJSONObject(j); if (!roleObj.has("value")) { allRolesValid = false; break; } String roleValue = roleObj.getString("value").trim(); if (roleValue == null || roleValue.isEmpty()) { allRolesValid = false; break; } } if (allRolesValid && rolesArray.length() > 0) { // 根据角色数量动态创建数组 Value[] userInfo = new Value[rolesArray.length()]; // 遍历所有角色并封装为Value对象 for (int j = 0; j < rolesArray.length(); j++) { JSONObject roleObj = rolesArray.getJSONObject(j); String roleValue = roleObj.getString("value").trim(); Value value = new Value(roleValue, roleValue); userInfo[j] = value; } Operations operation = new Operations( operations.getJSONObject(i).getString("op").trim(), "operations.value.roles.value", userInfo); operationsObjArr[i] = operation; } else { proceed = false; break; } }
修改要点说明
- 遍历所有角色元素:通过循环处理roles数组中的每一个角色对象,不再局限于第一个元素
- 批量合法性校验:提前检查所有角色的
value字段是否存在且非空,确保数据有效性 - 动态数组创建:根据roles数组的实际长度生成
Value[],适配任意数量的角色 - 代码可读性优化:将重复的JSON路径提取为变量(如
rolesArray),减少冗余代码
内容的提问来源于stack exchange,提问作者imzz
相关产品推荐
相关产品推荐

