Джексон - десериализация только определенных полей из YAML - PullRequest
0 голосов
/ 06 июля 2019

Мой 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?

...