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

如何在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;
    }
}

修改要点说明

  1. 遍历所有角色元素:通过循环处理roles数组中的每一个角色对象,不再局限于第一个元素
  2. 批量合法性校验:提前检查所有角色的value字段是否存在且非空,确保数据有效性
  3. 动态数组创建:根据roles数组的实际长度生成Value[],适配任意数量的角色
  4. 代码可读性优化:将重复的JSON路径提取为变量(如rolesArray),减少冗余代码

内容的提问来源于stack exchange,提问作者imzz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 11:17:40