TL;博士
我有一大组数据,看起来像只包含值的 JSON 对象数组。我想知道正则表达式是否可以简洁地处理这种结构:
"[]" --> List.of(List.of())
"[{'v1','v2','v3'}]" --> List.of(List.of("v1","v2","v3"))
"[{'v4','v5'},{'v6','v7'}]" --> List.of(List.of("v4","v5"),List.of("v6","v7"))
值是有序的;将为每个具有有序参数的内部列表构造一个 POJO,并且每个值都是每个 POJO 中定义的基元(
int
、long
或String
)。
详情
此解析器是 POJO 的 Jackson CSV 序列化器/反序列化器的一部分,带有 POJO 容器。不幸的是,
CsvMapper
只支持带有基元容器的 POJO,因此需要自定义解析器(据我所知)。例如,这样的结构:
record Person(
String name,
List<Pet> pets) {
}
record Pet(
String name,
String type) {
}
所以如下:
new Person("Jan", List.of(new Pet("Mr. Bubbles", "dog"), new Pet("Lilly", "cat")));
序列化为 CSV 为两列:
Jan,"[{'Mr. Bubbles','dog'}, {'Lilly','cat'}]"
第二列是 POJO 的容器。要反序列化,我的自定义 Jackson 反序列化器会这样做:
public static class PersonDeserializer extends StdDeserializer<Person> {
private static final long serialVersionUID = 1L;
public PersonDeserializer() {
this(Person.class);
}
public PersonDeserializer(Class<Person> type) {
super(type);
}
@Override
public Person deserialize(JsonParser p, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
JsonNode node = p.getCodec().readTree(p);
String name = node.get("name").asText();
List<Pet> pets = deserialize(node.get("pets").asText());
return new Person(name, pets);
}
private static List<Pet> deserialize(String serializedPets) {
List<Pet> pets = new ArrayList<>();
// messy custom parser, ATM
// ...
return pets;
}
}
一个非常混乱的
deserialize
自定义解析器构建POJO。我希望有更多正则表达式经验的人可以提供帮助?
这里是纯java方式:
List<List<String>> result = Arrays.stream(input.replaceAll("^.\\{?|}?.$", "").split("},\\{}"))
.map(inner -> Arrays.stream(inner.replaceAll("^.'?|'?.$", "").split("','")).toList())
.toList();