Как я могу сгладить полиморфное поле в Котлине с Джексоном, чтобы на верхнем уровне появлялись пользовательские клавиши JAVA

Программисты JAVA общаются здесь
Anonymous
 Как я могу сгладить полиморфное поле в Котлине с Джексоном, чтобы на верхнем уровне появлялись пользовательские клавиши

Сообщение Anonymous »

Я использую Джексона (с поддержкой YAML) в проекте Kotlin, где у меня есть полиморфное поле, которое может быть одним из нескольких типов. Я хочу, чтобы вывод YAML использовал пользовательский ключ типа (например, «git» или «файловая система» ) на верхнем уровне вместо свойства с именем ContractSource или тегов типа YAML. /p>
мои классы данных 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)
}
}
}
И это мой объект MogateMapper Конфигурация:

Код: Выделить всё

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 ( и! ), а не просто ключ с именем "git" или "fileystem" .
Мне нужно иметь возможность понижать получение полученного 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

Вернуться в «JAVA»