Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.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
字段名";“零件”;在JSON中,会导致反序列化失败_Json_Kotlin_Jackson_Jackson Databind - Fatal编程技术网

字段名";“零件”;在JSON中,会导致反序列化失败

字段名";“零件”;在JSON中,会导致反序列化失败,json,kotlin,jackson,jackson-databind,Json,Kotlin,Jackson,Jackson Databind,在下面的代码中,由于 com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.util.ArrayList<de.richtercloud.jackson.deserialize.list.of.objects.DeserializationTest$D>` out of FIELD_NAME token at [Source: (String

在下面的代码中,由于

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.util.ArrayList<de.richtercloud.jackson.deserialize.list.of.objects.DeserializationTest$D>` out of FIELD_NAME token
 at [Source: (String)"{
            "a": [
                {
                    "c": {
                        "Parts": []
                    }
                }
            ]
        }"; line: 5, column: 25] (through reference chain: de.richtercloud.jackson.deserialize.list.of.objects.DeserializationTest$A["a"]->java.util.ArrayList[0]->de.richtercloud.jackson.deserialize.list.of.objects.DeserializationTest$B["c"])

    at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)
    at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1442)
    at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1216)
    at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1168)
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.handleNonArray(CollectionDeserializer.java:332)
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:265)
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:245)
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:27)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1284)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:326)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:159)
    at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:530)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeWithErrorWrapping(BeanDeserializer.java:528)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:417)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1287)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:326)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:159)
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:286)
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:245)
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:27)
    at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:530)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeWithErrorWrapping(BeanDeserializer.java:528)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:417)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1287)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:326)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:159)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4202)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3205)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3173)
    at de.richtercloud.jackson.deserialize.list.of.objects.DeserializationTest.testDeserialization(DeserializationTest.kt:22)
[omitted JUnit stacktrace]
我希望无论我选择哪个名称,这个测试都能工作,因为字段名是数据,不应该对反序列化算法的行为有任何影响

我尝试了
parts
a
和许多其他名称,并在
jackson-databind
源代码中在线搜索“parts”是关键字的提示

.configure(反序列化功能.ACCEPT_SINGLE_VALUE_AS_ARRAY,true)
添加到
ObjectMapper
初始化会导致异常消息更改为
com.fasterxml.jackson.module.kotlin.MissingKotlinParameterException:JSON属性e的[simple type,class de.richtercloud.jackson.deserialize.list.of.objects.DeserializationTest$D]值失败,因为creator参数e的值不可为NULL(因此为NULL),该参数是不可为NULL的类型

我正在使用以下版本:

<properties>
    <kotlin.version>1.3.61</kotlin.version>
    <junit5.version>5.5.2</junit5.version>
    <jackson.version>2.10.1</jackson.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.jetbrains.kotlin</groupId>
        <artifactId>kotlin-stdlib</artifactId>
        <version>${kotlin.version}</version>
    </dependency>
    <dependency>
        <groupId>org.jetbrains.kotlin</groupId>
        <artifactId>kotlin-reflect</artifactId>
        <version>${kotlin.version}</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>${jackson.version}</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.module</groupId>
        <artifactId>jackson-module-kotlin</artifactId>
        <version>${jackson.version}</version>
    </dependency>

    <!-- test dependencies -->
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter</artifactId>
        <version>${junit5.version}</version>
        <scope>test</scope>
    </dependency>
</dependencies>

1.3.61
5.5.2
2.10.1
org.jetbrains.kotlin
科特林标准实验室
${kotlin.version}
org.jetbrains.kotlin
科特林反射
${kotlin.version}
com.fasterxml.jackson.core
杰克逊数据绑定
${jackson.version}
com.fasterxml.jackson.module
杰克逊模块科特林
${jackson.version}
org.junit.jupiter
朱尼特朱庇特
${junit5.version}
测试
我可以通过指定

data class C(@JsonProperty("Parts") val parts: List<D>)
数据类C(@JsonProperty(“零件”)val零件:列表)
然而,我想了解这个问题/行为。

这是杰克逊的一个“特点”:

建议的解决方案是使用
@JsonProperty
,就像您已经做的那样

只有
snake\u case
键也可以正常工作,不过:

internal class DeserializationTest {

    @Test
    fun testDeserialization() {
        val serialized = """{
            "a": [
                {
                    "c": {
                        "parts": []
                    }
                }
            ]
        }"""
        val deserialized = createObjectMapper().readValue(serialized, A::class.java)
        assertNotNull(deserialized)
    }

    fun createObjectMapper() = ObjectMapper().registerModule(KotlinModule())

    data class A(val a: List<B>)

    data class B(val c: C)

    data class C(val parts: List<D>)

    data class D(var e: String)
}
内部类反序列化测试{
@试验
有趣的testDeserialization(){
val序列化为“”{
“a”:[
{
“c”:{
“部分”:[]
}
}
]
}"""
val反序列化=createObjectMapper().readValue(序列化,A::class.java)
assertNotNull(反序列化)
}
fun createObjectMapper()=ObjectMapper().registerModule(KotlinModule())
数据类别A(val A:列表)
数据类别B(val c:c)
数据类别C(val零件:列表)
数据类D(变量e:字符串)
}
internal class DeserializationTest {

    @Test
    fun testDeserialization() {
        val serialized = """{
            "a": [
                {
                    "c": {
                        "parts": []
                    }
                }
            ]
        }"""
        val deserialized = createObjectMapper().readValue(serialized, A::class.java)
        assertNotNull(deserialized)
    }

    fun createObjectMapper() = ObjectMapper().registerModule(KotlinModule())

    data class A(val a: List<B>)

    data class B(val c: C)

    data class C(val parts: List<D>)

    data class D(var e: String)
}