Java将带有逗号分隔值的字符串列表转换为对象列表

时间:2018-08-11 00:13:41

标签: class collections java-8

我想转换一个人的json数组

persons: [
  {"1, Franck, 1980-01-01T00:00:00"},
  {"2, Marc, 1981-01-01T00:00:00"}
]

使用此类到Person对象的列表:

class Person {
 private Integer id;
 private String name;
 private Date dateOfBirth;

 // getter and setter
}

是否可以使用转换器和Java 8?

public Person convert(String from) {
        String[] data = from.split(",");
        return new Person(Integer.parseInt(data[0]), data[1], new Date(data[2]));
    }

2 个答案:

答案 0 :(得分:2)

您可以这样做

activeColor

首先使用“}”字符Pattern idNumber = Pattern.compile("\\d+"); List<Person> persons = Arrays.stream(from.split("}")).filter(s -> idNumber.matcher(s).find()) .map(s -> s.substring(s.indexOf("{") + 1)).map(s -> s.split(",")) .map(a -> new Person(Integer.parseInt(a[0].replaceAll("\"", "")), a[1], LocalDateTime.parse(a[2].trim().replaceAll("\"", "")))) .collect(Collectors.toList()); 每个字符串,然后过滤掉不包含数字的无效标记。请注意,每个有效负载均应包含一个数字ID号。最后,删除ID数字之前出现的任何虚假的尾随字符,并将每个结果split映射到String对象。最后,Personcollect实例变成一个Person

请注意,我在List类的LocalDateTime字段中使用了dateOfBirth。因此Person类看起来像这样。

Person

但是,正如您所看到的,与编写所有这些代码相比,使用诸如Jackson public class Person { private final Integer id; private final String name; private final LocalDateTime dateOfBirth; // remainder omitted for the sake of brevity. } 之类的框架来完成工作总是很直观的。但是在这种情况下,您的Json格式错误,因此除非您修复json有效负载结构,否则您将无法使用这样的框架。

更新

这是更优雅的Java9解决方案。

ObjectMapper

在Java 9中,您现在可以使用String regexString = Pattern.quote("{\"") + "(.*?)" + Pattern.quote("\"}"); Pattern pattern = Pattern.compile(regexString); List<Person> persons = pattern.matcher(from) .results() .map(mr -> mr.group(1)).map(s -> s.split(", ")) .map(a -> new Person(Integer.parseInt(a[0]), a[1], LocalDateTime.parse(a[2]))) .collect(Collectors.toList()); 来获得Matcher#results()。这是documentation的摘录。

  

为输入的每个子序列返回匹配结果流   匹配模式的序列。匹配结果出现在同一位置   顺序作为输入序列中的匹配子序列。

我宁愿建议您使用Java9来解决此问题。

如果您只需要为Stream<MatchResult>的{​​{1}}的{​​{1}}表示形式进行操作,则可以这样做。

List

请注意,后者比以前的要容易得多,并且只包含原始解决方案的一部分。

答案 1 :(得分:1)

解决方案本身的扩展以及一些抽象:

List<String> personStr = Arrays.asList("1, Franck, 1980-01-01T00:00:00", "2, Marc, 1981-01-01T00:00:00");

List<Person> persons = personStr.stream()
            .map(Person::new)
            .collect(Collectors.toList());

Person类具有一个构造函数,该构造函数接受string arg将其转换为Person对象,如下所示:

public Person(String from) {
    String[] data = from.split(",");
    Arrays.parallelSetAll(data, i -> data[i].trim());
    this.id = Integer.parseInt(data[0]);
    this.name = data[1];
    this.dateOfBirth = new Date(data[2]);
}