我想转换一个人的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]));
}
答案 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
对象。最后,Person
个collect
实例变成一个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]);
}