Jackson-YAML:解析锚和引用
这是关于以下问题的后续问题: 我很难理解Jackson是如何处理引用的(因为它们在JSON中并不存在),所以我编写了一个测试:Jackson-YAML:解析锚和引用,jackson,kotlin,yaml,Jackson,Kotlin,Yaml,这是关于以下问题的后续问题: 我很难理解Jackson是如何处理引用的(因为它们在JSON中并不存在),所以我编写了一个测试: import com.fasterxml.jackson.databind.DeserializationFeature import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.dataformat.yaml.YAMLFactory import com.faster
import com.fasterxml.jackson.databind.DeserializationFeature
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory
import com.fasterxml.jackson.module.kotlin.KotlinModule
import org.junit.Test
import org.yaml.snakeyaml.Yaml
import kotlin.test.assertEquals
class YamlRefTest {
data class Item(val name: String)
data class Config(val availableItems: List<Item>,
val selectedItems: List<Item>)
@Test
fun testReferenceSnakeYaml() {
val parser = Yaml()
val test = (parser.load(testYaml)
as Map<String, Map<String, List<Map<String, String>>>>)["Config"]!!
assertEquals("test", test["availableItems"]!![0]["name"])
assertEquals("test", test["selectedItems"]!![0]["name"])
}
@Test
fun testReferenceJackson() {
val mapper = ObjectMapper(YAMLFactory())
.registerModule(KotlinModule())
.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true)
val config = mapper.readValue(testYaml, Config::class.java)
assertEquals(1, config.selectedItems.size)
assertEquals("test", config.selectedItems[0].name)
}
companion object {
val testYaml = """
Config:
availableItems:
- &a1
name: test
- &a2
name: test2
selectedItems:
- *a1
"""
}
}
注意:正确使用@JsonIdentityInfo
的答案很有帮助(我似乎不知道这是如何翻译成锚的)
com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `undagen.YamlRefTest$Item` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('a1')
at [Source: (StringReader); line: 9, column: 9] (through reference chain: undagen.YamlRefTest$Config["selectedItems"]->java.util.ArrayList[0])