当前位置: 首页 > 知识库问答 >
问题:

通过Kotlin与Jackson反序列化对象列表

姚晋
2023-03-14

我试图通过Kotlin使用Jackson对lastfm api提供的xml进行反序列化。我用JAXB在Java中实现了这一点,我正在尝试移植它。除以下示例中的“未包装列表”字段外,所有功能都正常工作。我知道Track数据类正在工作,因为如果我使用val Track:Track?=空而不是val track:List

我得到的错误是com。fasterxml。杰克逊。数据绑定。exc.MismatchedInputException:无法构造info的实例。艾德森。lastfm。Track(尽管至少存在一个创建者):没有字符串参数构造函数/工厂方法从字符串值反序列化(“Flash\Flash Gordon的主题”)\

我尝试过使用常规类而不是数据类,结果是一样的。根据https://www.baeldung.com/jackson-xml-serialization-and-deserialization只需添加@jacksonxmlementwrapper(useWrapping=false)注释。我尝试过使用和不使用@JacksoXmlProperty注释,并尝试在映射器上设置useWrapping

下一步我该怎么做?

object Api {

    fun getRecentTracks(): RecentTracks {
        val module = JacksonXmlModule()
        module.setDefaultUseWrapper(false);
        val xmlMapper = XmlMapper(module)
        xmlMapper.registerKotlinModule()
        xmlMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
        xmlMapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true)
        val params = HashMap<String?, String?>()
        params.put("user", "eidsonator")

        val out = Http.getRequest("user.getrecenttracks", params)
        val stream =  ByteArrayInputStream(out.toByteArray())
        return xmlMapper.readValue(stream, RecentTracks::class.java)
    }
}

data class RecentTracks(
    val user: String = "",
    val page: Int = -1,
    val perPage: Int = -1,
    val totalPages: Int = -1,
    val total: Int = -1,
    @JacksonXmlProperty(localName = "track") 
    @JacksonXmlElementWrapper(useWrapping = false)
    val track: List<Track>? = null
)

data class Track(
    val name: String = "",
    val artist: String = "",
    val album: String = ""
)

<?xml version="1.0" encoding="UTF-8"?>
<recenttracks page="1" perPage="50" total="283105" totalPages="5663" user="eidsonator">
    <track>
        <artist mbid="">Rockit</artist>
        <name>Flash \Flash Gordon's Theme\&quot;&quot;</name>
        <streamable>0</streamable>
        <mbid/>
        <album mbid="">Freddie Mercury Rework</album>
        <url>https://www.last.fm/music/Rockit/_/Flash+%5CFlash+Gordon%27s+Theme%5C%22%22</url>
        <image size="small">https://lastfm.freetls.fastly.net/i/u/34s/2a96cbd8b46e442fc41c2b86b821562f.png</image>
        <image size="medium">https://lastfm.freetls.fastly.net/i/u/64s/2a96cbd8b46e442fc41c2b86b821562f.png</image>
        <image size="large">https://lastfm.freetls.fastly.net/i/u/174s/2a96cbd8b46e442fc41c2b86b821562f.png</image>
        <image size="extralarge">https://lastfm.freetls.fastly.net/i/u/300x300/2a96cbd8b46e442fc41c2b86b821562f.png</image>
        <date uts="1578532113">09 Jan 2020, 01:08</date>
    </track>
    <track>
        <artist mbid="">A June &amp; J Beat</artist>
        <name>Irony</name>
        <streamable>0</streamable>
        <mbid>fa542ad6-ed2f-4ce6-ab4c-b2671cd916fa</mbid>
        <album mbid="">Appetizers (Chillhop Presents)</album>
        <url>https://www.last.fm/music/A+June+&amp;+J+Beat/_/Irony</url>
        <image size="small">https://lastfm.freetls.fastly.net/i/u/34s/6aded46748a466920f12854069d9226e.jpg</image>
        <image size="medium">https://lastfm.freetls.fastly.net/i/u/64s/6aded46748a466920f12854069d9226e.jpg</image>
        <image size="large">https://lastfm.freetls.fastly.net/i/u/174s/6aded46748a466920f12854069d9226e.jpg</image>
        <image size="extralarge">https://lastfm.freetls.fastly.net/i/u/300x300/6aded46748a466920f12854069d9226e.jpg</image>
        <date uts="1578531592">09 Jan 2020, 00:59</date>
    </track>
    <!-- 48 more tracks...   -->
</recenttracks>

共有1个答案

云景焕
2023-03-14

这个问题似乎是由您试图采用这个XML的事实引起的:

<artist mbid="">Rockit</artist>

并将其反序列化为一个名为艺术家的字符串属性。专辑也是如此。可以使用name,因为它没有mid属性,但是由于艺术家专辑具有该属性,Jackson不能直接将该XML元素反序列化为字符串,因为它不知道要用mBid做。(您可以通过删除mid属性来检查这一点:一旦我这样做了,反序列化就起作用了。)

Track上的artistalbum属性是否应该是对象本身,其中一个属性用于mbid,另一个属性用于文本?

 类似资料:
  • 我有一个抽象的超类A,我有几个具体的子类B,C,D 在序列化方面,我执行以下操作: 没问题。我现在想反序列化这个。我知道我不能实例化一个抽象类,那么这是如何实现的呢? 这不起作用: 编辑:我把这个添加到我的抽象超类中:(仍然没有运气) 再次编辑:我现在遇到以下错误: 看看JSON,@class不在那里。我怎样才能做到?我试过: 但这并没有奏效。有这方面的例子吗?如何告诉对象映射器对类使用我的注释?

  • 我有下面的JSON,我正试图使用Jackson API反序列化它 我基本上需要一个附件类,它有一个AttachmentFile对象列表,如下所示: 如何使用自定义反序列化器实现这一点? 谢谢

  • 我有以下控制器: 使用以下请求对象: 当帖子通过并查看我得到的对象时,有效负载列表中有LinkedHashMap对象,而不是我的DTO类型的对象。 如何让Spring jackson将JSON转换为我的DTO对象。请记住,我计划对其他对象列表重用包装器响应DTO,这就是我使用通用列表(List)的原因。 这是我正在尝试的JSON。

  • 主要内容:1 编写核心类,2 运行测试本文讲解如何将一个Java对象序列化为一个json文件,然后读取该json文件读取回对象。在下面的示例中,我们创建Student类。使用Jackson存储到一个student.json文件,该文件拥有Student对象的JSON表示形式。 1 编写核心类 MainApp: 2 运行测试

  • 问题内容: 我需要从redis保存和加载对象。 该对象包含GrantedAuthority列表(除其他外),它是一个接口: Jackson成功地序列化了该对象,但是未能反序列化该对象,但有以下例外: 我知道可以通过添加以下内容来指定类型: 但是在这种情况下我无法做到这一点,因为the 是Spring的接口,我无法更改它。 序列化的json是: } 摘要只能用填充。 所以我尝试了: 仍然没有运气。

  • 我目前正在开发一个Java web应用程序,它使用Magento REST API公开的JSON数据。api返回的数据示例如下: 我的应用程序中有一个Java类,如下所示: 我想对数据进行反序列化,并将其转换为,但我总是得到以下错误: 这是我用来将JSON响应反序列化为ArrayList的语句行: 有人能分享一些见解吗?我看到一些例子,返回的JSON对象前面没有任何ID。那是因为我做错了什么吗?非