AnZ*_*AnZ 8 java xml android kotlin retrofit2
我正在尝试通过Retrofit 2使用SimpleXML来使用XML.经过几个小时与Kotlin的挣扎,我决定尝试Java版本,然后转换到Kotlin.Java版本运行良好......
错误:
java.lang.RuntimeException: org.simpleframework.xml.core.MethodException: Annotation @org.simpleframework.xml.ElementList(data=false, empty=true, entry=, inline=true, name=entry, required=true, type=void) must mark a set or get method
Run Code Online (Sandbox Code Playgroud)
我需要一个能够使用该XML的Kotlin模型类.这是输入:
<feed>
<entry>
<id> someid </id>
<published> somedate </published>
</entry>
<entry>
<id> someid2 </id>
<published> somedate2 </published>
</entry>
</feed>
Run Code Online (Sandbox Code Playgroud)
Java模型类版本(工作正常):
@Root(name = "feed", strict = false)
public class MFeed {
@ElementList(name = "entry", inline = true)
private List<MEntry> entriesList;
public MFeed(List<MEntry> entriesList) {
this.entriesList = entriesList;
}
public MFeed() {
}
public List<MEntry> getEntriesList() {
return entriesList;
}
public void setEntriesList(List<MEntry> entriesList) {
this.entriesList = entriesList;
}
}
@Root(name = "entry", strict = false)
public class MEntry {
@Element(name = "id")
private String id;
@Element(name = "published")
private String published;
public MEntry() {
}
public MEntry(String id, String published) {
this.id = id;
this.published = published;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPublished() {
return published;
}
public void setPublished(String published) {
this.published = published;
}
}
Run Code Online (Sandbox Code Playgroud)
和自动生成的Kotlin模型看起来像这样:
@Root(name = "feed", strict = false)
class Feed {
@ElementList(name = "entry", inline = true)
private var entriesList: List<MEntry>? = null
//autogenerated by converter java -> kotlin
constructor(entriesList: List<MEntry>) {
this.entriesList = entriesList
}
//autogenerated by converter java -> kotlin
constructor() {}
}
@Root(name = "entry", strict = false)
class Entry {
@Element(name = "id")
var id: String? = null
@Element(name = "published")
var published: String? = null
//autogenerated by converter java -> kotlin
constructor() {}
//autogenerated by converter java -> kotlin
constructor(id: String, published: String) {
this.id = id
this.published = published
}
}
Run Code Online (Sandbox Code Playgroud)
kur*_*urt 10
尝试添加@field
到您的注释@Element*
.您可以将属性移动到构造函数,也可以data
向类中添加修饰符.像这样:
@Root(name = "feed", strict = false)
data class Feed(
@field:ElementList(name = "entry", inline = true)
var entriesList: List<Entry>? = null
)
@Root(name = "entry", strict = true)
data class Entry(
@field:Element(name = "id")
var id: String? = null,
@field:Element(name = "published")
var published: String? = null
)
Run Code Online (Sandbox Code Playgroud)
有了这个我成功地反序列化xml:
import org.simpleframework.xml.Element
import org.simpleframework.xml.ElementList
import org.simpleframework.xml.Root
import org.simpleframework.xml.core.Persister
private val testXml = """
<feed>
<entry>
<id> someid </id>
<published> somedate </published>
</entry>
<entry>
<id> someid2 </id>
<published> somedate2 </published>
</entry>
</feed>
""".trimIndent()
@Root(name = "feed", strict = false)
data class Feed(
@field:ElementList(name = "entry", inline = true)
var entriesList: List<Entry>? = null
)
@Root(name = "entry", strict = true)
data class Entry(
@field:Element(name = "id")
var id: String? = null,
@field:Element(name = "published")
var published: String? = null
)
fun main(args: Array<String>) {
println(testXml)
val serializer = Persister()
val example = serializer.read(Feed::class.java, testXml)
println(example)
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1151 次 |
最近记录: |