Java 遍历每个键具有多个值的字符串对象的映射
我正在接收以下JSON对象,我只对错误感兴趣。我可以将每个键和值登录到控制台。例如,“Email”键有2个x值,如何创建一个映射或列表,使每个值都有自己的键并删除JSON格式Java 遍历每个键具有多个值的字符串对象的映射,java,codenameone,Java,Codenameone,我正在接收以下JSON对象,我只对错误感兴趣。我可以将每个键和值登录到控制台。例如,“Email”键有2个x值,如何创建一个映射或列表,使每个值都有自己的键并删除JSON格式 { "errors": { "Email":["'Email' must not be empty.","'Email' is not a valid email address."], "Company":["'Company' must not be empty."],
{
"errors":
{
"Email":["'Email' must not be empty.","'Email' is not a valid email address."],
"Company":["'Company' must not be empty."],
"LastName":["'Last Name' must not be empty."],
"Password":["'Password' must not be empty."],
"FirstName":["'First Name' must not be empty."],
"Telephone":["'Telephone' must not be empty."]
},
"title":"One or more validation errors occurred.",
"status":400,
"traceId":"80005307-0001-5d00-b63f-84710c7967bb"
}
在codenameone中,我正在使用JSON解析器解析字符串映射,对象:
Map<String,Object> result = new JSONParser().parseJSON(new InputStreamReader(new ByteArrayInputStream(r.getResponseData()), "UTF-8"));
Map<String,Object> value = (Map<String,Object>) result.get("errors");
for (Map.Entry<String, Object> entry : value.entrySet()) {
Log.p(entry.getKey());
Log.p(entry.getValue().toString())
}
Map result=new JSONParser().parseJSON(新的InputStreamReader(新的ByteArrayInputStream(r.getResponseData()),“UTF-8”);
Map value=(Map)result.get(“错误”);
for(Map.Entry:value.entrySet()){
Log.p(entry.getKey());
Log.p(entry.getValue().toString())
}
电子邮件字段的值是一个列表,如[]
方括号所示
由于errors
的所有字段似乎都有字符串列表,因此您应该简单地强制转换为Map
,这样就不必再强制转换了
Map<String,Object> result = /*result of parsing JSON input*/;
@SuppressWarnings({ "rawtypes", "unchecked" })
Map<String, List<String>> errors = (Map) result.get("errors");
for (Entry<String, List<String>> error : errors.entrySet()) {
String name = error.getKey();
List<String> messages = entry.getValue();
Log.p(name);
for (String message : messages)
Log.p(" " + message);
}
Map result=/*解析JSON输入的结果*/;
@SuppressWarnings({“rawtypes”,“unchecked”})
映射错误=(Map)result.get(“错误”);
对于(输入错误:errors.entrySet()){
字符串名称=error.getKey();
列表消息=entry.getValue();
Log.p(名称);
用于(字符串消息:消息)
Log.p(“+”消息);
}
那是你的事,兄弟,我只是更改了一些名称以提高可读性:
Map<String,Object> errors = (Map<String,Object>) map.get("errors");
Collection<Object> values = errors.values();
values.stream().flatMap(x->((ArrayList<String>)x).stream()).forEach(value -> {
String key = errors.entrySet()
.stream()
.filter(tempEntry -> ((ArrayList<String>)tempEntry.getValue()).contains(value))
.findAny()
.get()
.getKey();
System.out.println(key + value);
});
Map errors=(Map)Map.get(“errors”);
集合值=错误。值();
values.stream().flatMap(x->((ArrayList)x.stream()).forEach(值->{
字符串键=错误。entrySet()
.stream()
.filter(tempEntry->((ArrayList)tempEntry.getValue()).contains(value))
.findAny()
.get()
.getKey();
系统输出打印项次(键+值);
});
因此,您可以从中创建条目集合。目前我们打印它们,但您可以跳过“.getKey()”和“System.out”并开始将它们添加到集合中。电子邮件
没有多个值。它有一个单一的值,它是一个试图理解您的需求的列表。您是否希望每个电子邮件值在结果映射中有两个单独的键?是的,请使用ramu。不要强制转换到ArrayList
,强制转换到List
。JSON解析器可以使用它想要的任何类型的列表。