Код: Выделить всё
{
// other fields
"context": [
{
"id": "age",
"name": "Age",
"type": "string",
"value": "730 days +"
},
{
"id": "v2Score",
"name": "V2 Score",
"type": "number",
"value": 5.9
},
{
"id": "maturity",
"name": "Maturity",
"type": "string",
"value": "High"
},
{
"id": "coverage",
"name": "Product Coverage",
"type": "string",
"value": "Low"
},
{
"id": "threat_intensity",
"name": "Threat Intensity",
"type": "string",
"value": "Very Low"
},
{
"id": "threat_recency",
"name": "Threat Recency",
"type": "string",
"value": "No recorded events"
},
{
"id": "threat_sources",
"name": "Threat Sources",
"type": "string",
"value": "No recorded events"
}
]
}
Код: Выделить всё
class Context {
private final Age age;
private final Maturity maturity;
private final Coverage coverage;
private final ThreatIntensity threatIntensity;
private final ThreatRecency threatRecency;
// constructor, getters
}
Код: Выделить всё
enum Age {
@JsonProperty("0 - 7 days")
LESS_THAN_ONE_WEEK,
@JsonProperty("7 - 30 days")
ONE_WEEK_TO_ONE_MONTH,
@JsonProperty("30 - 365 days")
ONE_MONTH_TO_ONE_YEAR,
@JsonProperty("365 - 730 days")
ONE_TO_TWO_YEARS,
@JsonProperty("730 days + ")
MORE_THAN_TWO_YEARS
}
Как десериализовать этот массив объектов в отдельные перечисления? Каждый объект в массиве соответствует ровно один тип перечисления (т. е. в массиве никогда не будет двух объектов с одинаковым идентификатором), но объекты в массиве не гарантированно будут каждый раз находиться в одном и том же порядке. Есть ли способ сделать это с помощью аннотаций, например @JsonTypeInfo? Кроме того, хотя я не ожидаю отсутствия каких-либо перечислений, мне хотелось бы иметь возможность передавать «отсутствующие» перечисления как null. Например, если объект с «id»: «maturity» не присутствовал в массиве, связанный объект перечисления Maturity должен быть десериализован как нулевой. До сих пор данные, возвращаемые из этого API, либо включали все эти элементы, либо не включали ни одного из этих элементов (что приводило к «контексту»: []), хотя я не гарантирую, что это верно везде.
Я также могу игнорировать любые объекты в массиве с идентификатором, который меня не волнует (в данном случае v2Score и Threat_sources). Я включил их в пример, чтобы продемонстрировать, что могут быть данные, выходящие за рамки того, что мне нужно, и которые следует игнорировать. Кроме того, поля «имя» и «тип» в каждом из объектов можно игнорировать, поскольку для определения типа перечисления необходим только идентификатор и только «значение»< /code> необходим для выбора перечисления этого типа.
Я добрался до этого, прежде чем застрял в том, что делать. Я делаю все возможное, чтобы не использовать операторы switch для полей id или value, так как дополнения в будущем могут привести к ошибкам.
Код: Выделить всё
@JsonCreator
Context(
@JsonProperty("age") Age age,
@JsonProperty("Maturity") Maturity maturity,
@JsonProperty("coverage") Coverage coverage,
@JsonProperty("threat_intensity") ThreatIntensity intensity,
@JsonProperty("threat_recency") ThreatRecency recency,
) {
// basic constructor
}
Код: Выделить всё
context.getAge() // Age.MORE_THAN_TWO_YEARS
context.getMaturity() // Maturity.HIGH
context.getCoverage() // Coverage.LOW
context.getThreatIntensity() // ThreatIntensity.VERY_LOW
context.getThreatRecency() // ThreatRecency.NONE
Я полагаю, мне нужно каким-то образом использовать @JsonTypeInfo для каждого аргумента конструктора?
Я также знаю, как создать для этого собственный десериализатор, но делаю это делает код гораздо более хрупким, особенно если он будет расширен или изменен в будущем.
Подробнее здесь: https://stackoverflow.com/questions/786 ... n-property