这是完全通过的测试:
class teststackoverflow53499407{
内部数据类(val-intermeoflife:int)
数据类外部<T>(VAL内部:T)
fun<t>objectmapper.stringify(value:t,pretty:boolean=false):string{
StringWriter()。使用Writer->
如果(漂亮){
WriterWithDefaultPrettyprinter().WriteValue(Writer,Value)
}否则{
WriteValue(写入程序,值)
}
返回writer.toString()。
}
}
@测试
fun test53499407_cleantest()。{
VAL外部=外部(内部(42))
val objectmapper=jacksonObjectmapper()。
val serialized=objectmapper.stringify(外部,真)
println(序列化)
val parsed=objectmapper.readValue<外部<内部>>(序列化)
断言等于(42,已解析。内部。生命意义)
}
@测试
fun test53499407_惯用\u tweek()。{
VAL外部=外部(内部(42))
val jsonFactory=jsonFactory()。
jsonFactory.configure(jsonGenerator.feature.auto_close_target,false)
jsonFactory.configure(jsonParser.feature.ignore_undefined,true)
val objectmapper=对象映射器(jsonFactory)
objectmapper.find和registermodules()。
objectmapper.propertyNamingStrategy=propertyNamingStrategy.snakeSategy()。
objectmapper.setserializationInclusion(jsoninclude.include.non-null)
val serialized=objectmapper.stringify(外部,真)
println(序列化)
//此行改为惯用
val parsed=objectmapper.readValue<外部<内部>>(序列化)
断言等于(42,已解析。内部。生命意义)
}
@测试
fun test53499407_as_written_in_stackoverflow()中{
VAL外部=外部(内部(42))
val jsonFactory=jsonFactory()。
jsonFactory.configure(jsonGenerator.feature.auto_close_target,false)
jsonFactory.configure(jsonParser.feature.ignore_undefined,true)
val objectmapper=对象映射器(jsonFactory)
objectmapper.find和registermodules()。
objectmapper.propertyNamingStrategy=propertyNamingStrategy.snakeSategy()。
objectmapper.setserializationInclusion(jsoninclude.include.non-null)
val serialized=objectmapper.stringify(外部,真)
println(序列化)
//反序列化无法使用:
//https://stackoverflow.com/questions/11664894/jackson-deserialize-using-generic-class
ValPals= ObjutMaPr.Read Value& lt;Eng≫;(序列化,ObjistMaPl.TyrPrime.Cu构tMul形形体类型(Elut::Clase.java,In::Clasy.java))
断言等于(42,已解析。内部。生命意义)
}
}

这个测试用例通过了您的代码版本和更清晰的代码惯用版本。
注意我更新了stringify方法也要更加惯用,但这不会影响测试。
您的呼叫readValue也比必要的更复杂。变化:
val parsed = objectMapper.readValue<Outer<Inner>>(serialized, objectMapper.typeFactory.constructParametricType(Outer::class.java, Inner::class.java))
简单地说:
val parsed = objectMapper.readValue<Outer<Inner>>(serialized)
这是完全通过的测试:
class TestStackOverflow53499407 {
data class Inner(val meaningOfLife: Int)
data class Outer<T>(val inner: T)
fun <T> ObjectMapper.stringify(value: T, pretty: Boolean = false): String {
StringWriter().use { writer ->
if (pretty) {
writerWithDefaultPrettyPrinter().writeValue(writer, value)
} else {
writeValue(writer, value)
}
return writer.toString()
}
}
@Test
fun test53499407_cleanTest() {
val outer = Outer(Inner(42))
val objectMapper = jacksonObjectMapper()
val serialized = objectMapper.stringify(outer, true)
println(serialized)
val parsed = objectMapper.readValue<Outer<Inner>>(serialized)
assertEquals(42, parsed.inner.meaningOfLife)
}
@Test
fun test53499407_idiomatic_tweek() {
val outer = Outer(Inner(42))
val jsonFactory = JsonFactory()
jsonFactory.configure(JsonGenerator.Feature.AUTO_CLOSE_TARGET, false)
jsonFactory.configure(JsonParser.Feature.IGNORE_UNDEFINED, true)
val objectMapper = ObjectMapper(jsonFactory)
objectMapper.findAndRegisterModules()
objectMapper.propertyNamingStrategy = PropertyNamingStrategy.SnakeCaseStrategy()
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL)
val serialized = objectMapper.stringify(outer, true)
println(serialized)
// This line changed to be idiomatic
val parsed = objectMapper.readValue<Outer<Inner>>(serialized)
assertEquals(42, parsed.inner.meaningOfLife)
}
@Test
fun test53499407_as_written_in_stackoverflow() {
val outer = Outer(Inner(42))
val jsonFactory = JsonFactory()
jsonFactory.configure(JsonGenerator.Feature.AUTO_CLOSE_TARGET, false)
jsonFactory.configure(JsonParser.Feature.IGNORE_UNDEFINED, true)
val objectMapper = ObjectMapper(jsonFactory)
objectMapper.findAndRegisterModules()
objectMapper.propertyNamingStrategy = PropertyNamingStrategy.SnakeCaseStrategy()
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL)
val serialized = objectMapper.stringify(outer, true)
println(serialized)
// deserializing does not work using:
// https://stackoverflow.com/questions/11664894/jackson-deserialize-using-generic-class
val parsed = objectMapper.readValue<Outer<Inner>>(serialized, objectMapper.typeFactory.constructParametricType(Outer::class.java, Inner::class.java))
assertEquals(42, parsed.inner.meaningOfLife)
}
}
