遍历每个键有多个值的字符串对象映射
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" 并开始将它们添加到集合中。
我收到以下 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" 并开始将它们添加到集合中。