我正在尝试使用kotlin序列化将一个json文件解析为一个列表。这是我的数据类。
@Serializable
data class Book(
val epub : String,
val fb2 : String,
val mobi : String,
val djvu : String,
val title : String,
val author : String,
val anotation: String,
val cover_uri : String,
)
@Serializable
data class Books(
@Serializable (with = BookListSerializer::class)
val books : List<Book>
)
object BookListSerializer : JsonTransformingSerializer < List < Book >> ( ListSerializer ( Book.serializer ()))在这里,我试图解析一个字符串
val books = Json.decodeFromString<Books>(stringJson)在这里我的Json字符串
[
{
"anotation": "Этот город",
"author": "Чарльз Плэтт",
"cover_uri": "null",
"djvu": "null",
"epub": "/b/301494/epub",
"fb2": "/b/301494/fb2",
"mobi": "/b/301494/mobi",
"title": "New York Times (Пульс Нью-Йорка) (fb2)"
},
{
"anotation": "Способна л",
"author": "Триш Уайли",
"cover_uri": "/i/45/390445/cover.jpg",
"djvu": "null",
"epub": "/b/390445/epub",
"fb2": "/b/390445/fb2",
"mobi": "/b/390445/mobi",
"title": "Лучший мужчина Нью-Йорка (fb2)"
}
]我总是会犯这样的错误
kotlinx.serialization.json.internal.JsonDecodingException: Expected start of the object '{', but had 'EOF' instead
JSON input: .....2","mobi":"/b/49442/mobi","title":"I love New York (fb2)"}]我将非常高兴和感谢您的帮助。
发布于 2021-11-24 19:34:47
tl;博士
交换这个
val books = Json.decodeFromString<Books>(stringJson)有了这个
val books = Json.decodeFromString<List<Book>>(stringJson)您正在尝试反序列化一个JSON数组[ ... ],但是在调用decodeFromString时将一个类型为Books的对象声明为目标,因此类似于{ books: [ ... ] }。
您必须将JSON数组包装在JSON对象的属性books中,或者在反序列化期间将预期的类型更改为List<Book>。
因此,除了上述解决方案之外,还可以执行以下操作:
val wrappedStringJson = """
{
"books": $stringJson
}
""".trimIndent()
val books = Json.decodeFromString<Books>(wrappedStringJson)发布于 2022-08-18 09:25:16
在Ktor服务器上进行测试时,我也遇到了同样的问题。
fun testFun() = testApplication { ....
val response = client.get("/boruto/heroes")
val actual = Json.decodeFromString<ApiResponse>(response.content.toString())
....
}问题是,我使用的是content,而不是body。
val actual = Json.decodeFromString<T>(response.content.toString())
我把它改为这个,测试通过了。
val actual = Json.decodeFromString<T>(response.body())
把这个留在这里以防有人遇到同样的问题。
https://stackoverflow.com/questions/70101639
复制相似问题