мои классы данных Kotlin определяются следующим образом: < /p>
Код: Выделить всё
data class ContractConfig(
val contractSource: ContractSource? = null,
val provides: List? = null,
val consumes: List? = null
)
@JsonTypeInfo(use = Id.CUSTOM)
@JsonTypeIdResolver(value = ContractSourceIdResolver::class)
interface ContractSource
data class GitContractSource(
val url: String? = null,
val branch: String? = null
) : ContractSource
data class FileSystemContractSource(
val directory: String = "."
) : ContractSource
< /code>
My Custom Type Typed Id Resolver Maps Types для идентификаторов следующим образом: < /p>
class ContractSourceIdResolver : TypeIdResolverBase() {
override fun idFromValue(value: Any): String {
return when (value) {
is GitContractSource -> "git"
else -> "filesystem"
}
}
override fun idFromValueAndType(value: Any, suggestedType: Class): String = idFromValue(value)
override fun getMechanism(): Id = Id.CUSTOM
override fun typeFromId(context: DatabindContext, id: String?): JavaType {
return when (id) {
"git" -> context.constructType(GitContractSource::class.java)
else -> context.constructType(FileSystemContractSource::class.java)
}
}
}
Код: Выделить всё
val objectMapper = ObjectMapper(YAMLFactory()).apply {
registerKotlinModule()
setSerializationInclusion(JsonInclude.Include.NON_EMPTY)
}
< /code>
Однако, когда я сериализую экземпляр ContractConfig, я получаю вывод, как это: < /p>
- contractSource: !
url: "http://gitRepo"
branch: "1.0.1"
provides:
- "a.yaml"
- "b.yaml"
consumes:
- "c.yaml"
- "d.yaml"
- contractSource: !
directory: "repos"
provides:
- "1.yaml"
- "2.yaml"
consumes:
- "3.yaml"
- "4.yaml"
[*] Обертка вместо непосредственного размещения клавиши пользовательского типа (то есть «git» или «файловая система» ) на верхнем уровне.
[*] Он также использует теги типа YAML (
Код: Выделить всё
!Мне нужно иметь возможность понижать получение полученного YAML в мои классы Kotlin. : < /p>
- git:
url: "http://gitRepo"
branch: "1.0.1"
provides:
- "a.yaml"
- "b.yaml"
consumes:
- "c.yaml"
- "d.yaml"
- filesystem:
directory: "repos"
provides:
- "1.yaml"
- "2.yaml"
consumes:
- "3.yaml"
- "4.yaml"
< /code>
Вопросы: < /strong> < /p>
Можно ли достичь этой сплющенной структуры - без контракта теги типа обертки и YAML - используя аннотации Джексона (включая jsontypeinfo.id.custom) и все еще поддерживают десериализацию? Ключ пользовательского типа появляется на верхнем уровне как для сериализации, так и для десериализации? >
< /ul>
Любые рекомендации или предложения будут высоко оценены! < /p>
Подробнее здесь: https://stackoverflow.com/questions/794 ... ustom-type