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

iterate through a map of string object that has mutiple values per key

我收到以下 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())            
   } 

email 字段的值是 列表,如 [] 方括号所示。

由于 errors 的所有字段似乎都有字符串列表,您应该简单地转换为 Map<String, List<String>>,这样您就不必再进行转换了。

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<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);
    });

因此,您可以从中创建一个条目集合。目前我们打印它们,但您可以跳过“.getKey()”和 "System.out" 并开始将它们添加到集合中。