当前位置: 首页 > 知识库问答 >
问题:

我需要关于如何将两个具有相同键的值从json格式解析为java映射的建议

丌官承
2023-03-14

我正在将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"]}

所以我用map把它们放进去,下面显示的一些代码,

但我的方法只能检索第一个json值,即包含{“sid”:“729999”}的值,而不包含{“sid”:“724605”}的第二个值,

我观察到的程序日志是:

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"}  

Z39414,Managers,developer.alle.com dn:cn=Z39414,ou=Managers,dc=developer,dc=alle,dc=com uid:brucelee用户密码:qwdmsdierf mail:brucelee@gm.macom信息:2006/02/12 sn:Bruce Lee部门号:{“sid”:“729999”,“uid”:501,“name”:“tebase”,“role”:“Managers”,“title”:“sales”,“groups”:[“others”]}部门号:{“sid”:“724605”,“uid”:37

搜索结果搜索:2结果:0成功NumResponses:2 NumEntries:1

我的问题是,我如何将两个json值都放入我的map中,或者我对map的用法是错误的,有更好的方法来处理这种情况?

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个答案

慕容嘉熙
2023-03-14

java.util.map 接口只为每个键保留一个值。如果要为每个键保存多个值,则需要为v部分指定一个集合类。例如,如下所示。

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

Java EE API中定义javax.ws.rs.core.multivaluedMap接口就是一个实现您想要实现的功能的示例。

 类似资料:
  • 我会从我想达到的目标开始 意图 该软件在for循环中解析XML数据。处理数据的 for 循环将持续到 50(因为我得到了 50 个不同的结果)。我最初所做的是,-方法解析整个XML数据并将其保存到TextViews中并显示它。但现在我想添加一个启动画面,只要数据加载就会显示。 XML文件像任何其他普通XML文件一样构建,因此当我通过for循环时,键总是相同的,但值不同。 方法 我已经做的是创建一个

  • 我有两个数据格式不同但值相同的表。 表一: 表二: 表1和表2之间的关系是多对一。此表的值与上面的日期格式相同。我现在的任务是映射这些表。我如何在ERD图中显示这些。我必须创建一个新表吗?

  • 假设我有一组字符串和一个散列函数(或任何单边函数)和一个测试函数。我想用Java8流创建一个从输入字符串到通过测试函数的哈希值的映射。我的问题是如何在中编写? 看来老的for循环是最简洁的解决方案。

  • 问题内容: 我正在尝试创建一个通用类型,该通用类型保留已创建的自身版本的地图以供以后使用。实际上,这是一种单例模式,其中每种类型都有一个实例。到目前为止,我的代码是: 但是,我仍然不确定我是否“做对了”。感觉我应该能够指定该集合为(类-> FieldBinder)。IDE警告有关return语句的事实只会加强这种想法。 有没有更好的方法来解决这个问题? 注意:这个问题似乎密切相关,但是距离足够远,