Jackson-YAML:解析锚和引用

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

这是关于以下问题的后续问题: 我很难理解Jackson是如何处理引用的(因为它们在JSON中并不存在),所以我编写了一个测试:

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])