杰克逊解析错误

Posted

技术标签:

【中文标题】杰克逊解析错误【英文标题】:Jackson Parsing Error 【发布时间】:2018-08-25 18:47:57 【问题描述】:

我有一个看起来像这样的 Kotlin 数据类

@Type("event")
@JsonNaming(PropertyNamingStrategy.KebabCaseStrategy::class)
open class Event(
        @PrimaryKey
        @Id(IntegerIdHandler::class)
        var id: Int? = null,
        var identifier: String? = null,
        var name: String? = null,
        var latitude: Double? = null,
        var longitude: Double? = null,
        var locationName: String? = null,
        var startsAt: String? = null,
        var endsAt: String? = null,
        var timezone: String? = null,
        var description: String? = null,
        var logoUrl: String? = null,
        var organizerName: String? = null,
        var organizerDescription: String? = null,
        var ticketUrl: String? = null,
        var privacy: String? = null,
        var type: String? = null,
        var topic: String? = null,
        var subTopic: String? = null,
        var codeOfConduct: String? = null,
        var email: String? = null,
        var schedulePublishedOn: String? = null,
        var searchableLocationName: String? = null,
        var state: String? = null,
        var isSessionsSpeakersEnabled: Boolean = false,
        var thumbnailImageUrl: String? = null,
        var originalImageUrl: String? = null,
        var largeImageUrl: String? = null,
        var iconImageUrl: String? = null,
        var createdAt: String? = null,
        var deletedAt: String? = null,
        @Relationship("event-copyright")
        var eventCopyright: Copyright? = null,
        @Relationship("speakers-call")
        var speakersCall: SpeakersCall? = null,
        @Relationship("social-links")
        var socialLinks: RealmList<SocialLink>? = null
) : RealmObject() 
    override fun equals(other: Any?): Boolean 
        if (this === other) return true
        if (javaClass != other?.javaClass) return false
        if (other !is Event) return false

        if (id != other.id) return false
        if (identifier != other.identifier) return false
        if (name != other.name) return false
        return true
    

    override fun hashCode(): Int 
        var result = id ?: 0
        result = 31 * result + (identifier?.hashCode() ?: 0)
        result = 31 * result + (name?.hashCode() ?: 0)

        return result
    

    override fun toString(): String 
        return "Event(id=$id, identifier=$identifier, name=$name)"
    


我使用 Jackson 作为 Mapper 将我的 JSON 映射到这个 Event 模型中。 在模型中,有一个属性isSessionsSpeakersEnabled。等效的 JSON 属性键是 "is-sessions-speakers-enabled"。当模型用 Java 编写时,给定的类映射非常好,但是一旦我将其转换为 Kotlin,使用的命名策略显然将 isSessionsSpeakersEnabled 更改为 "sessions-speakers-enabled" 而不是 "is-sessions-speakers-enabled"。为什么会发生这种情况,我该如何解决?

【问题讨论】:

你试过使用@JsonProperty 吗? 我不想使用@JsonProperty。这就是为什么存在命名策略以对每个字段进行通用命名的原因 @SriramR,是的,这确实是命名策略存在的原因,但 @JsonProperty 等注释存在的原因是因为命名策略可能并不总是与您的用例完美匹配。 @JsonProperty 是对您问题的简单直接的回答;否则你不妨将你的类恢复为 Java。 但是这里的命名策略非常适合我的用例。 java 中的字段名称与 kotlin 中的字段名称相同。所以命名策略应该和java中的一样 【参考方案1】:

对于任何想知道如何在不添加太多样板的情况下修复它的人,

发生此错误是因为 Kotlin 删除了所有生成的 getter 方法前面的“is”。因此,这导致了我的解析问题,因为我的 json 包含“is”前缀。所以我需要在这里使用@JsonProperty

但如果我将@JsonProperty() 添加到一个字段,我将不得不将@JsonProperty() 添加到每个字段,这很麻烦。所以我加了 @field:JsonProperty() 代替。这使我能够在不向代码添加太多样板的情况下获得所需的功能,并且 NamingStrategy 负责其余字段。

我希望这很清楚。

【讨论】:

以上是关于杰克逊解析错误的主要内容,如果未能解决你的问题,请参考以下文章

杰克逊:反序列化(解析)空Unicode

使用杰克逊的 LocalDateTime 解析

用杰克逊解析数组

由于输入结束杰克逊解析器,没有要映射的内容

杰克逊序列化没有正确处理单引号

杰克逊:使用时区 id 解析 ZonedDateTime