gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 23:46:21 25 4
gpt4 key购买 nike

我正在努力将 LDAP 中的 ldif 属性读取到我的 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”}的第二个值,

我观察到程序日志是:

这是从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 base with scope subtree filter: uid=brucelee requesting: ALL

Z39414, Managers, developer.alle.com dn: cn=Z39414,ou=Managers,dc=developer,dc=alle,dc=com uid: brucelee userPassword: qwdmsdierf mail: brucelee@gm.macom info: 2006/02/12 sn: Bruce Lee 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"]} department: 000000 givenName: Bruce Lee objectClass: inetOrgPerson objectClass: organizationalPerson objectClass: person objectClass: top cn: Z39414 displayName: Bruce Lee description: Bruce Lee

搜索结果 搜索:2 结果: 0 成功 回复数量:2 条目数: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;
}

最佳答案

java.util.Map<K,V>接口(interface)只为每个键保存一个值。如果要为每个键保存多个值,则需要为V指定一个集合类。部分。例如,如下所示。

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

<a href="https://docs.oracle.com/javaee/7/api/javax/ws/rs/core/MultivaluedMap.html" rel="noreferrer noopener nofollow">javax.ws.rs.core.MultivaluedMap</a> Java EE API 中定义的接口(interface)是实现您想要做的事情的示例。

关于java - 需要有关如何将具有相同键的两个值从 json 格式解析为 java map 的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58239094/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com