为“[{'v4','v5'},{'v6','v7'}]”拆分正则表达式

问题描述 投票:0回答:1

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 regex regex-group jackson-databind
1个回答
0
投票

这里是纯java方式:

List<List<String>> result = Arrays.stream(input.replaceAll("^.\\{?|}?.$", "").split("},\\{}"))
    .map(inner -> Arrays.stream(inner.replaceAll("^.'?|'?.$", "").split("','")).toList())
    .toList();
© www.soinside.com 2019 - 2024. All rights reserved.