如何将JsonString的JsonArray转换为字符串列表

时间:2019-12-05 17:05:40

标签: java json

此问题仅适用于JSON处理的Java API(JSR 353)。

给定一个JsonArray,其元素是JsonString,我如何轻松地将其转换为List<String>a Set<String>?对于Set<String>,我们假设JsonArray包含一个唯一的字符串值集合。

假设我有一个像这样的JSON对象:

{
  "name" : "James Johns",
  "street" : "22 Nancy St.",
  "emails" : [
               "james@a.com",
               "james@b.net",
               null,
               ""
             ]
}

我希望得到的集合可以忽略emails数组中的任何空或空字符串条目。

假设我的JsonObject实例已经创建。

JsonObject person = <parse the JSON input>;
JsonArray emails = person.get("emails");

我一直对JsonValue和JsonString感到困惑,并试图获取实际的String值。如果我使用JsonValue.toString()JsonString.toString()方法,则会得到包含双引号的字符串值,就像原始JSON是"\"james@a.com\""一样。我需要将字符串值设置为等效的JSON值"james@a.com"

1 个答案:

答案 0 :(得分:0)

使用Java 8,可以像这样轻松地将JsonString的JsonArray转换为List:

JsonObject person = <parse the JSON input>;

List<String> emailList = 
    Optional.ofNullable(person.getJsonArray("emails"))
            .orElse(JsonValue.EMPTY_JSON_ARRAY) // Use an empty list if the property's value was null
            .getValuesAs(JsonString::getString) // Get each JsonString entry as String
            .stream()                           // Turn the collection into a stream for filter/collect
            .filter(email -> email!=null && !email.isEmpty())  // Exclude any null/empty entries
            .collect(Collectors.toList());                     // Create the List

  • ofNullable/orElse组合保证即使该数组为空,我也可以得到JsonArray,从而避免了任何Null指针异常的考虑。
  • getValuesAs(JsonString::getString)是一个JsonArray方法,通过将JsonString.getString()方法应用于每个返回的JsonString来返回列表。 JsonString.getString()方法返回字符串值“ james@a.com”,而不是JsonString.toString()方法返回的“ \” james@a.com \“”值。
  • stream()方法将集合转换为顺序流,我们可以用来过滤和收集原始集合的成员。
  • filter()方法将谓词email -> email!=null && !email.isEmpty()应用于流中的每个条目,并丢弃所有空条目或为空字符串的条目。
  • 最后,collect()方法将过滤后的条目收集到指定的收集类型中。

要获取Set<String>,请将.collect()更改为使用:

.collect(Collectors.toSet())

一旦您习惯了Java 8的机制,这种方法将提供一种简洁,易于阅读和理解的技术来操作集合,而无需使用更复杂的空/空检查和使用for循环的方法。