杰克逊解析错误

时间:2018-03-16 16:12:31

标签: java android json jackson kotlin

我有一个看起来像这样的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映射到此事件模型中。 在模型中,有一个属性isSessionsSpeakersEnabled。等效的JSON属性键是"is-sessions-speakers-enabled"。当模型用Java编写时,给定的类映射非常好,但是一旦我将其转换为Kotlin,使用的命名策略显然将isSessionsSpeakersEnabled更改为"sessions-speakers-enabled"而不是"is-sessions-speakers-enabled"。为什么会发生这种情况?如何解决?

1 个答案:

答案 0 :(得分:0)

对于任何想知道如何修复它而不添加太多样板文件的人,

发生此错误是因为Kotlin删除了&#34; is&#34;在所有getter方法生成之前。这导致我的解析问题,因为我的json包含&#34;是&#34;字首。所以我需要在这里使用@JsonProperty

但是,如果我将@JsonProperty()添加到一个字段,我将不得不将@JsonProperty()添加到每个字段,这只是凌乱。所以我补充道 而是@field:JsonProperty()。这使我能够获得我所需的功能,而无需在代码中添加太多样板,并且NamingStrategy负责其余的字段。

我希望这很清楚。