Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果使用子类型和泛型,则无法使用Jackson解析Json_Java_Json_Kotlin_Jackson_Fasterxml - Fatal编程技术网

Java 如果使用子类型和泛型,则无法使用Jackson解析Json

Java 如果使用子类型和泛型,则无法使用Jackson解析Json,java,json,kotlin,jackson,fasterxml,Java,Json,Kotlin,Jackson,Fasterxml,我有这样的类层次结构: @JsonIgnoreProperties(ignoreUnknown = true) @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY) @JsonSubTypes( JsonSubTypes.Type(value = SubClass1::class, name = "SC1"), JsonSubTypes.Type(value

我有这样的类层次结构:

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY)
@JsonSubTypes(
    JsonSubTypes.Type(value = SubClass1::class, name = "SC1"),
    JsonSubTypes.Type(value = SubClass2::class, name = "SC2")
)
interface Base

data class SubClass1(
    @JsonProperty("i") val i: Int
) : Base

data class SubClass2(
    @JsonProperty("s") val s: String
) : Base
我还有一些容器:

data class Container(
    @JsonProperty("base") val base: Base
)

data class GenericContainer<T: Base> (
    @JsonProperty("base") val base: T
)
因为json字符串不包含字段“@type”

关于这一点,我有两个问题:

  • 如果我知道json字符串的类型,我是否可以在不使用类型字段的情况下解析该字符串?因为我可以从一些客户端获得类似这样的json字符串——他们不知道子类型
  • 如果1不可能,我是否可以始终将这些类的“@type”字段写入json字符串
  • 目前我正在使用最新的FasterXMLJackson(2.12.3)

        val mapper = ObjectMapper()
    
    //  It works
        val jsonStringSubClass = mapper.writeValueAsString(SubClass1(1))    // {"base":{"@type":"SC1","i":1}}
        val subClassInstance = mapper.readValue(jsonStringSubClass, SubClass1::class.java)
        println(subClassInstance)   // SubClass1(i=1)
    
    //  It works too
        val jsonStringContainer = mapper.writeValueAsString(Container(SubClass1(1)))    // {"base":{"@type":"SC1","i":1}}
        val containerInstance = mapper.readValue(jsonStringContainer, Container::class.java)
        println(containerInstance)    // Container(base=SubClass1(i=1))
    
    //  It works too
        val jsonStringGenericContainer = mapper.writeValueAsString(GenericContainer(SubClass1(1)))    // {"base":{"@type":"SC1","i":1}}
        val genericType = mapper.typeFactory.constructParametricType(
            GenericContainer::class.java,
            SubClass1::class.java
        )
        val genericContainerInstance = mapper.readValue<GenericContainer<SubClass1>>(jsonStringGenericContainer, genericType)
        println(genericContainerInstance)    // GenericContainer(base=SubClass1(i=1))
    
    data class GenericContainer<T> (
        @JsonProperty("base") val base: T
    )
    
    com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Could not resolve subtype of [simple type, class SubClass1]: missing type id property '@type' (for POJO property 'base')
     at [Source: (String)"{"base":{"i":1}}"; line: 1, column: 15] (through reference chain: GenericContainer["base"])