Мой YAML похож на ниже
campaign:
meta:
version: 1
name: APT18
description: Test description
tag:
- execution
- persistence
- privilege escalation
reference:
- https://example.com
Я хочу разобрать только определенные поля из этого YAML (то есть name и description only).Чтобы быть более конкретным, я просто хочу десериализовать только те поля, которые присутствуют в соответствующем POJO.
Ниже приведены мои POJO на данный момент
Campaign
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonRootName(value = "campaign")
public class Campaign {
Map<String, Meta> meta = new LinkedHashMap<>();
}
Мета
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class Meta {
private String name;
private String description;
}
Код моего основного синтаксического анализатора
ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
mapper.disable(DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES);
mapper.disable(DeserializationFeature.FAIL_ON_MISSING_EXTERNAL_TYPE_ID_PROPERTY);
mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
Campaign campaign = mapper.readValue(campaignContent, Campaign.class);
В настоящее время мне нужно только имя и описание отэто ЯМЛ.Обратите внимание, что эти YAML генерируются на внешнем источнике, который не находится под нашим контролем, поэтому модификация на источнике невозможна.Я подумываю написать десериализатор для этого, но единственное, что я могу придумать, это
public class MetaDeserializer extends JsonDeserializer<Meta> {
@Override
public Program deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
ObjectCodec oc = jp.getCodec();
JsonNode node = oc.readTree(jp);
final String name = node.get("name").asText();
final String description = node.get("description").asText();
return new Meta(name, description);
}
}
Это работает прекрасно, однако, есть способ, которым я могу изменить это, чтобы включить только те поля, которыеприсутствуют в POJO?