нужны предложения о том, как проанализировать два значения с одинаковым ключом из формата JSON в карту Java - PullRequest
0 голосов
/ 04 октября 2019

Я работаю над чтением атрибутов ldif из LDAP в моей java-программе, моя первоначальная мысль - поместить эти атрибуты в карту, а затем разобрать их из нее, но я обнаружил, что есть атрибуты, называемые "DepartmentNumber", который содержит два значения формата json,

departmentNumber: {"sid":"729999","uid":501,"name":"tebase","role":"managers","title":"sales","groups":["others"]}
departmentNumber: {"sid":"724605","uid":37,"name":"tebase","role":"managers","title":"develope","groups":["leaders"]}

, поэтому я использовал карту, чтобы поместить их, некоторые коды, показанные ниже,

, но мой способ может получить только 1-е значение json, которое являетсятот, который содержит {"sid": "729999"}, но не имеет второго значения, которое содержит {"sid": "724605"},

Я заметил, что журнал программы:

этожурнал, который читает из атрибутов ldif

2019 22:30:58,237 authentication.mzauth   authentication.mzauth.doAuthenticate(mzauth.java:44)  
{"uid":"brucelee","mail":"brucelee@gm.macom","displayName":"Bruce Lee","givenName":"Bruce Lee","departmentNumber":"{\"sid\":\"729999\",\"uid\":501,\"name\":\"teabas\",\"role\":\"managers\",\"title\":\"sales\",\"groups\":[\"others\"]}","objectClass":"inetOrgPerson","description":"Bruce Lee","sn":"Bruce Lee","cn":"Z39414","department":"000000","info":"2006/02/12"}   

это журнал, который помещается в карту и анализирует их

2019 22:30:58,247 services.LdapService services.LdapService.getUser(LdapService.java:251)
ldap user:{"username":"brucelee","fullname":"Bruce Lee","email":"brucelee@gm.macom","departmentid":"729999","titles":[{"schoolid":"729999","titles":["managers","sales"]}],"cloudroles":{"usage":"clouddev","roles":[{"appname":"mail","departmentid":"729999","titles":["managers","sales"]}]},"guid":"c00d5ba660145307c84f2c1e1c557e4ededaf1830029d40aa5b244027","pid":"Z39414","openid":"http://openid.macom/brucelee"}  

, как вы можете прочитать, есть только 1 значение,sid: 72999, вместо двух значений,

исходные атрибуты ldif:

База LDAPv3 с фильтром поддерева области: uid = brucelee, запрашивающий: ALL

Z39414, менеджеры, developer.alle.com dn: cn = Z39414, ou = менеджеры, dc= разработчик, dc = alle, dc = comid: brucelee userPassword: qwdmsdierf mail: brucelee@gm.macom информация: 2006/02/12 sn: Брюс Ли DepartmentNumber: {"sid": "729999", "uid": 501, "name": "tebase", "role": "менеджеры", "title": "sales", "groups": ["others"]} DepartmentNumber: {"sid": "724605", "uid":37, "name": "tebase", "role": "менеджеры", "title": "develop", "groups": ["лидеры]]} отдел: 000000 данное имя: Брюс Ли objectClass: inetOrgPerson objectClass: organizPerson objectClass: person objectClass: top cn: Z39414 displayName: Брюс Ли описание: Брюс Ли

поиск результатов поиска: 2 результат: 0 Success numResponses: 2 numEntries: 1

myвопрос в том, как я могу поместить оба значения 2 json в мою карту, или я неправильно использую карту, и есть лучший способ справиться с такой ситуацией?

public DataModel getUser(String uid, String passwd, String role, DataModel   user) throws Exception {
private Map<String, String> map = null;
   if (role.equals("managers")) {
            map = Ldap.getAttrubites(ldapurl, uid, passwd);
            List<Titles> titlesArray = new ArrayList<>();
            List<Roles> rolesArray = new ArrayList();
            map.forEach((key, value)
                    -> {logger.info("{} - {}", key, value); });
     if (key.equals("departmentNumber")) {
                List<StringModel> model = map.get("departmentNumber")).get();
                model.stream().forEach(k -> {
                for (int i = 0; i < model.size(); i++) {
                            Titles titles = new Titles();
                            List<String> titleList = new ArrayList<>();
                            String userid = model.get(i).getUid();
                            String mtitle = model.get(i).getRole();
                            String subtitle = model.get(i).getTitle();
                            titleList.add(mtitle);
                            titleList.add(subtitle);
                            titles.setSchoolid(schoolid);
                            titles.setTitles(titleList);
                            titlesArray.add(titles);

                 ........ });}
                 user.setTitles(titlesArray);
                 .........;
    } return user;
    }

1 Ответ

0 голосов
/ 08 октября 2019

Интерфейс java.util.Map<K,V> содержит только одно значение для каждой клавиши. Если вы хотите хранить несколько значений для каждого ключа, вам нужно указать класс коллекции для части V. Например, как показано ниже:

Map<String, List<String>> map = ...

Интерфейс <a href="https://docs.oracle.com/javaee/7/api/javax/ws/rs/core/MultivaluedMap.html" rel="nofollow noreferrer">javax.ws.rs.core.MultivaluedMap</a>, определенный в Java EE API, является примером, который позволяет достичь того, что вы хотите сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...