Java 遍历每个键具有多个值的字符串对象的映射

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."],

我正在接收以下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."],
        "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解析器可以使用它想要的任何类型的列表。