我试图通过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\""</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 & 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+&+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>
这个问题似乎是由您试图采用这个XML的事实引起的:
<artist mbid="">Rockit</artist>
并将其反序列化为一个名为艺术家
的字符串属性。专辑
也是如此。可以使用name
,因为它没有mid
属性,但是由于艺术家
和专辑
具有该属性,Jackson不能直接将该XML元素反序列化为字符串,因为它不知道要用mBid
做。(您可以通过删除mid
属性来检查这一点:一旦我这样做了,反序列化就起作用了。)
Track
上的artist
和album
属性是否应该是对象本身,其中一个属性用于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。那是因为我做错了什么吗?非