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

Class Java将具有逗号分隔值的字符串列表转换为对象列表,class,collections,java-8,Class,Collections,Java 8,我想转换person的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 } 是否可以使用

我想转换person的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
}
是否可以使用转换器和Java8来实现这一点

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

你可以这样做

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());
但是,正如您所看到的,使用一些框架(如Jackson
ObjectMapper
)来完成工作总是很直观的,而不是编写所有这些。但在这种情况下,Json格式不正确,因此除非修复Json有效负载结构,否则无法使用这种框架

更新

这里有更优雅的Java9解决方案

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

请注意,后一种方法比前一种方法简单得多,只包含原始解决方案的一个子集。

是您的解决方案本身的扩展&带有一点抽象:

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

你应该看看类似jacksonxml的json解析器来完成这些任务。json数组是不正确的。json数组中的对象是什么?是
字符串
还是
json
对象?谢谢Ravindra,这完全有道理!但是,如果你有一个列表作为参数来转换为列表,你知道怎么做吗?@Andrew给我看看你的输入列表,然后我就可以更新答案了。因为我使用的是SpringBoot,我在考虑使用一个包装器,这样我就可以将RequestBody自动映射到这个包装器,然后将它转换成一个列表:public class personswapper{private List persons;},所以这个列表中的每个字符串都是这样的:“2,Marc,1981-01-01T00:00:00”伙计,你太棒了!我已经有一段时间没有使用java了,能够以这种方式转换它真是太好了!
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());
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]);
}